这是一篇翻译文章,原文出处: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. Hbase之尝试使用错误列族获取数据

    import com.google.common.base.Strings; import org.apache.hadoop.conf.Configuration; import org.apach ...

  2. Hbase之取出行数据指定部分(类似MySQL的Limit)

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; import org. ...

  3. IE7浏览器下CSS属性选择器二三事

    一.为何专门说起IE7 以前,或者说数年前,我们从事桌面端网页开发的时候,基本上都还要兼顾IE6浏览器, 即使有些特性,IE7支持,我们也会忽略之.于是,我们会不自然地把IE6和IE7浏览器归为一路货 ...

  4. 在VBA中调用工作表函数

    虽然VBA几乎可以完成所有工作表函数的功能,但是有时候在无法打开思路的时候,适当调用一些工作表函数也未尝不可,在VBA中调用工作表函数需要用到 WorksheetFunction对象,例如: Work ...

  5. sqlserver定時備份

    通常备份的方式有两种:手动备份和自动备份,如果数据库服务器中有这么多的数据库需要备份,那么手动备份必定是一个很大的工作量,这个时候我们可以采用另外一种备份方式---定时自动备份. SQLServer的 ...

  6. android入门之: SharedPreferences

    读取数据: 保存数据: +++++++++++++++++++方法详解++++++++++++++++++++++++++++++ SharedPreferences综述: 使用getSharedPr ...

  7. hdu------1281 棋盘游戏(最小覆盖点)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. 转 数据库中的 date datetime timestamp的区别

    转 数据库中的 date datetime timestamp的区别 DATETIME, DATE和TIMESTAMP类型是相关的.本文描述他们的特征,他们是如何类似的而又不同的. DATETIME类 ...

  9. hdu 1520

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  10. HTML去掉网页IE滚动条

    做了一个页面,与桌面分辨率一样大小,但是在IE全屏(F11)下却显示有滚动条,此教程由软件自学网首发,而火狐确没有.怎么样去掉IE滚动条呢?其实有一个属性就可以解决. 方法1:直接在body里面加上属 ...