这是一篇翻译文章,原文出处:http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial

Swift语言中如何使用JSON数据教程

JSON(全称:JavaScript Object Notation),是网络服务中传输数据的常用方法,JSON因为容易使用,且可读性强, 所以非常受到欢迎。

下面是个JSON的一个片段:

[

  {"person": {"name":"Dani","age":""}},

  {"person": {"name":"ray","age":""}}

]

在objective-c 中解析JSON数据相当的简单:

NSString *age = json[][@"person"][@"age"];

NSLog(@"Dani's age is %@", age);

但在更加现代化的语言swift中, 因为optionals数据类型的原因,JSON数据解析起来反而要麻烦。

if let item = json[] {

  if let person = item["person"] {

    if let age = person["age"] {

      println(age)

    }

  }

}

上面的代码中,每从JSON数据中解析一次就需要通过optional binding检查,这可以让代码更加安全,但也让解析工作变得复杂,如果解析饿更复杂的jsons代码变的冗余。

我们开始一个例子

下载例子开始程序项目。这个程序是为了获取App Store中top25的app.

里面有几个文件

TopApps.json:包含用于json解析的文件

AppModel:代表应用类

DataManager:获取本地和远程数据类,使用这个文件里的方法加载JSON数据。

viewController :目前是空的,待会我门在里面写入代码。

原生的解析JSON数据的方法

在viewController.swift文件中的viewDidLoad()方法添加如下代码:

DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in

  // 使用optional binding and NSJSONSerialization类获取排名第一的app

  //

  var parseError: NSError?

  let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data,

    options: NSJSONReadingOptions.AllowFragments,

    error:&parseError)

  //

  if let topApps = parsedObject as? NSDictionary {

    if let feed = topApps["feed"] as? NSDictionary {

      if let apps = feed["entry"] as? NSArray {

        if let firstApp = apps[] as? NSDictionary {

          if let imname = firstApp["im:name"] as? NSDictionary {

            if let appName = imname["label"] as? NSString {

              //

              println("Optional Binding: \(appName)")

            }

          }

        }

      }

    }

  }

}

运行后的结果:

Optional Binding: Clash of Clans

结合SwiftJSON第三方框架解析JSON数据

首先在github下载SwiftJSON,地址:https://github.com/lingoer/SwiftyJSON 然后 下载文件解压,然后将目录中的SwiftJSON.swfit拷贝到项目目录里。

替换viewDidLoad()内容:

override func viewDidLoad() {

  super.viewDidLoad()

  DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in

    // 使用SwiftyJSON 获取排名第一的app

    let json = JSON(data: data)

    if let appName = json["feed"]["entry"][]["im:name"]["label"].string {

      println("SwiftyJSON: \(appName)")

    }

  }

}

我们注意首先json()初始化data,并转换成JSON对象

使用SwiftJSON的好处是,它处理了所有的optional数据类型的检查,我们只需要知道json数据的key和索引后,其他就可以交给 SwiftJSON来处理。

在上面的代码中,我门还使用了string方法获取string 值, SwiftJSON还有个arrayValue来获取数组。

运行结果:

SwiftyJSON: Clash of Clans

获取远程JSON数据

在DataManager.swift中添加下列方法:

class func getTopAppsDataFromItunesWithSuccess(success: ((iTunesData: NSData!) -> Void)) {

  //

  loadDataFromURL(NSURL(string: TopAppURL)!, completion:{(data, error) -> Void in

      //

      if let urlData = data {

        //

        success(iTunesData: urlData)

      }

  })

}

然后在viewController.swfit 中viewDidLoad()添加如下方法:

//从iTunes and 并通过SwiftyJSON获取排名第一的app

DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in

  let json = JSON(data: iTunesData)

  if let appName = json["feed"]["entry"][]["im:name"]["label"].string {

    println("NSURLSession: \(appName)")

  }

  // More soon...

}

运行结果:

wiftyJSON: Clash of Clans

NSURLSession: Clash of Clans

解析JSON到array数组

在viewController中More soon  后添加如下内容:

//

if let appArray = json["feed"]["entry"].arrayValue {

  //

  var apps = [AppModel]()

  //

  for appDict in appArray {

    var appName: String? = appDict["im:name"]["label"].stringValue

    var appURL: String? = appDict["im:image"][]["label"].stringValue

    var app = AppModel(name: appName, appStoreURL: appURL)

    apps.append(app)

  }

  //

  println(apps)

}

从JSON 数据中遍历并保存到类型为appModel的apps数组中。

运行程序:

在真实的程序中,我们会通过UITableView或者UICollectionView显示数据。

这就是使用原生类和第三方类库SwfitJSON解析JSON数据的方法。

Swift语言中如何使用JSON数据教程的更多相关文章

  1. 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON

    SwiftyJSON能够让在Swift语言中更加简便处理JSON数据. With SwiftyJSON all you have to do is: ? 1 2 3 4 let json = JSON ...

  2. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

  3. WPF:使用Json.NET在TreeView中树形显示JSON数据

    原文 WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工 ...

  4. 关于swift语言中导入OC三方类找不到头文件的解决方法

    首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...

  5. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

  6. Dart 和 Flutter 使用json_annotation和json_serializable来处理json数据教程

    在学习fultter的时候突然想到如何去处理从服务器获取的json或者将app中的对象数据转换成json上传给服务器 于是研究一下dart对json数据的处理 首先需要依赖下面的第三方库(这里要强调下 ...

  7. 如何在Crystal Portlet中正确返回JSON数据给AJAX请求?

    当Crystal Portlet中需要采用Ajax请求,并让后台返回Json数据时,如何才能正确.方便的返回Json数据呢? 以下两种方法均可: 方法一:Ajax请求时,采用RenderURL,对应P ...

  8. 在MVC中动态读取JSON数据创建表格

    //使用getJSON // ("@Url.Action("GetAllUsers","User")" ,json文件的路径.也可以是 /M ...

  9. WebApi 中请求的 JSON 数据字段作为 POST 参数传入

    使用 POST 方式请求 JSON 数据到服务器 WebAPI 接口时需要将 JSON 格式封装成数据模型接收参数.即使参数较少,每个接口仍然需要单独创建模型接收.下面方法实现了将 JSON 参数中的 ...

随机推荐

  1. Linux安装多个Python版本

    服务器上的Python版本太老了,需要安装一个新的Python版本,才能跑我的代码.因为环境的需要,但是又不能卸载老的版本,所以安装一个新的,使用软链来进行升级. 使用系统自带的yum,apt-get ...

  2. grub4dos通用菜单及相关工具包

    grub4dos通用菜单及相关工具包 全套工具包(含PE.ISO,可根据需要替换删减):http://pan.baidu.com/s/1i4EjWod模板文件3.3M(不含PE.ISO):http:/ ...

  3. 如何用腾讯云打造一款微视频APP

    版权声明:本文由腾讯云原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/196 来源:腾云阁 https://www.qclo ...

  4. 安卓App热补丁动态修复技术介绍

    版权声明:本文由johncz原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/169 来源:腾云阁 https://www.q ...

  5. SAP 用事务码SQVI 做简单报表 .

    集团计划总监要去德国参展,要一份离当前日期最近的出口欧美国家产品单价. 需要从A903,MARA,KONP,MATK 这4张表里取数. 1)Tcode:SQVI进入,如图 2) 在快速浏览处输入名称: ...

  6. Web打印使用printThis.js

    <script src="~/Content/JQueryTools/printThis/printThis.js"></script>

  7. Cmd Markdown 简明语法手册

    『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 简明语法手册 标签: Cmd-Markdown 1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体. 示例: 这是 ...

  8. cf(#div1 A. Dreamoon and Sums)(数论)

    A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input stand ...

  9. eclipse 中提示tomcat 的端口被占用了 后的最快捷解决方法

    很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat  或者去修改tomcat的端口号 ,其实这么做太麻 ...

  10. kafka客户端代码解析

    转载:http://backend.blog.163.com/blog/static/202294126201431724652597/ 可以使用服务器端下载的kafka二进制包及依赖,也可以通过ma ...