Swift 与 JSON 数据必发bifa88手机客服端

大家大家日常在支付 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必发bifa88手机客服端,: 让重临的 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

相关文章