Swift 与 JSON 数据

我们大家平常以支付 App 的时,相信接触最多之就是 JSON 数据了。只要你的
App 有读取网络数据的法力,你不怕未不了而和 JSON 打交道。比如你做一个新闻
App,你要是读取和分析新闻数据,这样才会亮为用户。

那么我们今天便来打探一下 JSON 以及她当 App 中的使吧。

以前少节约咱们会介绍 JSON 数据格式,如果你已经针对性 JSON
比较了解了,那么也得以过了前少节省,继续阅读后的情节。

什么是 JSON

率先,JSON 的全称叫做 JavaScript Object Notation ,翻译成中文即是
JavaScript 对象表示法,是同等种轻量级的数交互格式。

JSON 数据分为三种植形式,对象,数组,值。

目标是一个无序的“‘名称/值’对”集合。一个对象为“{”(左括哀号)开始,“}”(右括声泪俱下)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’
对”之间以“,”(逗号)分隔。

必发bifa88手机客服端 1

数组是价值(value)的雷打不动聚集。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值期间下“,”(逗号)分隔。

必发bifa88手机客服端 2

价值(value)可以是夹逗号括起来的字符串(string)、数值(number)、true、false、
null、对象(object)或者数组(array)。这些构造可以嵌套。

必发bifa88手机客服端 3

下面是一个简约的例证:

{
  "firstname": "San",
  "lastname" : "Zhang",
  "age": 21,
  "friends": ["Mark","Li"]
}

面的数码示例,表示了这样一个结构,首先我们的多少让同一对大括声泪俱下包围,那么我们的数据就是
对象
类型,然后其其中有四只属性,firstname,lastname,age,friends
其中前少独属于性 firstnamelastname 字符串类型,他们之价值分别是
SanZhangage 属性代表年龄,所以她的值一个 Number 类型的
21

在意一下,字符串类型和数字品种的别,字符串类型的值用一对准双引号括了起来,而数值类不待双引号。

最后,friends
属性的值是一个累组,用同样对中括号包围起来,而数组中之素,仍然是字符串类型。

如上就是 JSON 的一个中坚组织,关于 JSON 更详实的牵线,可以参见
json.org

JSON 数据实例

咱俩看了了 JSON 的格式之后,那么我们虽随之看一下现实的 JSON
数据是哪的格式为?

照是气候数据接口:
http://api.openweathermap.org/data/2.5/weather?q=China,bj&lang=zh\_cn

如若我们以浏览器打开这个地点,我们就可以看到近似这样的多少:

{
  "coord": {
    "lon": 116.4,
    "lat": 39.91
  },
  "weather": [
    {
      "id": 520,
      "main": "Rain",
      "description": "阵雨",
      "icon": "09d"
    },
    {
      "id": 701,
      "main": "Mist",
      "description": "薄雾",
      "icon": "50d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 300.39,
    "pressure": 1008,
    "humidity": 94,
    "temp_min": 297.15,
    "temp_max": 303.71
  },
  "visibility": 2300,
  "wind": {
    "speed": 1,
    "deg": 140
  },
  "clouds": {
    "all": 75
  },
  "dt": 1437281131,
  "sys": {
    "type": 1,
    "id": 7405,
    "message": 0.0136,
    "country": "CN",
    "sunrise": 1437253268,
    "sunset": 1437305986
  },
  "id": 1816670,
  "name": "Beijing",
  "cod": 200
}

俺们来简单看一下,数据完整采用同样针对大括哀号包围的,也就是说返回给我们的数目,是一个
JSON 对象 紧接着,这个目标涵盖了 coord
属性,这个特性的价又是一个靶,里面来点儿个特性 ‘lon’ 和 ‘lat’
代表地理位置,后面还有好多其它性能代表天气的数目。

JSON
数据格式,可以好结构化的表示出天气的音信。而且数据结构一目了然,非常的清。并且产生许多在线工具得以帮助大家更好的编纂和查阅
JSON 数据。
比如
http://www.jsoneditoronline.org

Swift 中处理 JSON 数据

俺们当摸底了 JSON 数据后,就持续我们的主题吧。

必发bifa88手机客服端 4

使用 NSJSONSerialization

Swift 中处理 JSON 数据方式发出大多种。首先,由于 Swift 可以引用 Cocoa
原生库,所以我们可用 Cocoa 中的 NSJSONSerialization 来处理 JSON
数据,这个类似为蛮好理解,它会将 JSON 数据,转换成 Cocoa 中的
NSDictionaryNSArray。我们来拘禁一下哪些用 NSJSONSerialization
来处理:

let APIURL = "http://api.openweathermap.org/data/2.5/weather?q=China,bj&lang=zh_cn"

if let url = NSURL(string: APIURL) {

    if let jsonData = NSData(contentsOfURL: url) {

        if let jsonObj:NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.allZeros, error: nil) as? NSDictionary{

            if let weathers:NSArray = jsonObj["weather"] as? NSArray {

                var weatherSummary = "北京天气情况:"

                for weather in weathers {

                    if let desc:String = weather["description"] as? String {

                      weatherSummary += desc + " "

                    }

                }

                print(weatherSummary)

            }

        }

    }

}

为我们来挨家挨户个教学。

  1. 第一,我们透过 let url = NSURL(string: APIURL) 来讲天气接口包装成
    NSURL。

  2. 下一场,我们以 let jsonData = NSData(contentsOfURL: url) 将这
    URL 的情节读取下载,存放到 NSData 中。

  3. 通下,我们即将动用 NSJSONSerialization 将这些多少解析成 JSON
    了。
    let jsonObj:NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.allZeros, error: nil) as? NSDictionary
    此我们 JSONObjectWithData 方法将盛传的 NSData 数据解析成 JSON
    对象,如果我们的 JSON
    根节点是为目标形式存放的,那么我们获得的就是是一个
    NSDictionary。而如果是盖数组形式存放的,那么我们收获的饶是一个
    NSArray 了。后面还有零星个参数 options 代表 JSON
    读取选项,这个我们稍后会摆到,error 参数表示 JSON
    读博中之错,如果传入 nil 表示不受错误信息。

  4. 咱俩得了剖析出的 JSON
    后,我们虽可以像看普通集合对象那样获得中的音讯了:

if let weathers:NSArray = jsonObj["weather"] as? NSArray {

    var weatherSummary = "北京天气情况:"

    for weather in weathers {

        if let desc:String = weather["description"] as? String {

          weatherSummary += desc + " "

        }

    }

    print(weatherSummary)

}

咱俩这边将天气情况读取出来,并打印至屏幕上,以我们地方的多少也例,打印及屏幕上就是以此样子:

北京市天气情况:阵雨 薄雾

NSJSONSerialization 的读取选项

纵然于刚刚,我们采用 NSJSONSerialization 成功的解析了 JSON
数据,觉得之所以起很凉爽吧。仔细回想一下,我们刚尚留意到发一个 options
参数我们没详尽介绍。这个我们得把它叫读取选项,这个参数的门类是
NSJSONReadingOptions,它的取值可以是以下几栽:

  1. MutableContainers: 让返回的 JSON 数据被之数组和字典是不过重复改的。
  2. AllowFragments: 允许 JSON 返回的数量发生多单彻底节点。
  3. MutableLeaves: 使 JSON 返回的字符串是可更改之。

深信有胆大心细的朋友见面发现。。。

必发bifa88手机客服端 5

我靠,这说的还是什么那,我还是无明了!

故此。。客官莫急,听自己一一道来。

  • MutableContainers

首先,MutableContainers 这个选项就叫返回的 JSON
集合可转,让咱们来拘禁一个事例就是一目了然了:

var jsonString:NSString = "{\"names\":[\"James\",\"Jobs\",\"Tom\"]}" as NSString
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)

if let jsonObj:NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary {

    //操作之前
    print(jsonObj) //James, Jobs, Tom

    if let nameArray:NSMutableArray = jsonObj["names"] as? NSMutableArray {

        nameArray.addObject("Cook")

    }

    //操作之后
    print(jsonObj) //James, Jobs, Tom, Cook

}

俺们看一下咔嚓,上面的代码,我们以 JSONObjectWithData
方法调用的时,加入了 NSJSONReadingOptions.MutableContainers
读取参数,
这样一来我们就是好改变我们的结果集了,我们注意到上面的立段代码:

if let nameArray:NSMutableArray = jsonObj["names"] as? NSMutableArray {

       nameArray.addObject("Cook")

}

取得 names 数组,并当里边长一个新的项。随后我们重新打印 jsonObj
对象,这次显示的结果就是咱转移了的了。

假使我们以调用 JSONObjectWithData 方法的下用
NSJSONReadingOptions.MutableContainers
选项去丢的话语,我们便无能够转这个中其他数组的素了。

首先单选项 MutableContainers 我们看了呀。 我们后续

  • AllowFragments

还有另外一个选项参数,就是 AllowFragments
这个参数的法定说明是同意让分析的 JSON 数据的一干二净层级,不是数组和目标。

前额。。 听起来怪怪的糟糕理解是吧。

其一选项确实容易逗歧义,包括外的名称
AllowFragments,翻译成汉语叫许碎片,
什么让允许碎片也,我又自己实施研究过是之前自己直接是这样觉得的。。。

必发bifa88手机客服端 6

AllowFragments 的意思,是勿是足以分析这样的 JSON?

{"name":"Jobs"},{"name":"Ive"}

一段时间以来我之琢磨里是如此想的。可惜了不是那么回事儿,如果您将这么的
JSON 数据传被 JSONObjectWithData
方法,你用获一个无情的剖析错误。。。

这就是说,这东西到底是为什么用的呀~

骨子里官文档上面说之一清二楚,可以为与节点不是目标或数组。在 JSON
中才发生三栽档次,对象,数组,值。

实际说白了即是这样,允许而的 JSON
数据是一个字面值,比如字符串,数字,等等。

按我们得以流传一个原本的字符串

"something wrong about api"

这种多少,如果您打开了 AllowFragments
是了好健康解析的(注意少止的双料引号,这个呢富含在回来的数据遭到)。而只要你未曾打开这选项,对于这种数量就是会见分析失败了。

var jsonFragmentString = "\"something wrong about api\"" as NSString

let jsonFragmentData = jsonFragmentString.dataUsingEncoding(NSUTF8StringEncoding)

if let jsonObj: AnyObject = NSJSONSerialization.JSONObjectWithData(jsonFragmentData!, options: .AllowFragments, error: nil) {

    //使用 AllowFragments 选项,解析成功。
    print(jsonObj)

}

看罢上面的代码,相信大家瞬间尽管清楚了,原来这家伙是做此用底。

  • ** MutableLeaves **
    MutableLeaves
    选项,这个选项让自家一直百相思不得其解,文档上说,使用了这个选项后,所有目标的叶子节点的字符串属性,都见面成
    NSMutableString,而自试遍多种文档,也无说明出来,得到的字符串依然是
    NSString 而不是 NSMutableString

使用 NSJSONSerialization 创建 JSON 数据

才我们询问及哪用 NSJSONSerialization
来分析数据。同样的,我们还好采用 NSJSONSerialization 来构建 JSON
数据。

被我们看一下下的代码:

let names = ["Jobs","Cook","Ive"]

if let jsonData = NSJSONSerialization.dataWithJSONObject(names, options: NSJSONWritingOptions.allZeros, error: nil) {
    let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)
    // ["Jobs","Cook","Ive"]
}

咱利用 dataWithJSONObject 方法将 JSON 对象转换成 JSON
数据,我们传入的靶子好是数组也得是字典,分别对应了 JSON
中的数组和对象。

咱们注意到 dataWithJSONObject 这个法子也闹个 options
选项,它因此来支配构建 JSON 时的挑三拣四项,类型为
NSJSONWritingOptions。它不过出一个取舍,就是
NSJSONWritingOptions.PrettyPrinted

以此选项之意吗家喻户晓,就是深受变化的 JSON 数据是得天独厚的格式化的:

let jsonObj = ["name":"Jobs","friends":["Ive","Cook"]]

if let jsonData = NSJSONSerialization.dataWithJSONObject(jsonObj, options: NSJSONWritingOptions.PrettyPrinted, error: nil) {

    let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)

}

使用 PrettyPrinted 选项,我们输出的 JSON 就是这样一个精格式化的:

{
  "name": "Jobs",
  "friends": [
    "Ive",
    "Cook"
  ]
}

只要我们并未使用此选项,那么我们赢得的出口就是这样:

{"name": "Jobs","friends": ["Ive","Cook"]}

别就是于当下,这生知了咔嚓。

其他方案

本来矣,除了利用原生的 NSJSONSerialization 来处理
JSON,我们尚可使多叔着库来进行 JSON
数据的操作,比如:SwiftyJSON,
Argo。

抑制篇幅和大家之看疲劳期,我们当下首文章就介绍原生的方法。后续还见面为大家再次详尽的任课这些第三方库的运,以及她们的裨益和缺陷。

下面是本篇文章对应之 playground
文件,大家下载下来当相应能当再好的参照:

swift-json.playground

再也多精彩内容可关注微信公众号:
swift-cafe

相关文章