Swift 与 JSON 数据

By admin in 亚洲必赢app在哪下载 on 2018年10月22日

咱俩大家平常当开 App 的时光,相信接触最多之即是 JSON 数据了。只要您的
App 有读取网络数据的功效,你就算无不了若跟 JSON 打交道。比如你开一个新闻
App,你若读取和分析新闻数据,这样才会亮为用户。

那我们今天即令来询问一下 JSON 以及它们当 App 中之以吧。

每当前边少节咱们见面介绍 JSON 数据格式,如果您曾经指向 JSON
比较了解了,那么也得超过了前少节,继续看后的始末。

什么是 JSON

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

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

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

亚洲必赢app在哪下载 1

数组是价值(value)的静止聚集。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值内下“,”(逗号)分隔。

亚洲必赢app在哪下载 2

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

亚洲必赢app在哪下载 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 数据后,就继续我们的主题吧。

亚洲必赢app在哪下载 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 返回的字符串是只是再次改的。

相信有胆大心细之朋友见面意识。。。

亚洲必赢app在哪下载 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 数据的一干二净层级,不是数组和目标。

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

以此选项确实容易招惹歧义,包括外亚洲必赢app在哪下载的名称
AllowFragments,翻译成汉语叫允许碎片,
什么为允许碎片也,我又自己履研究了之之前自己直接是这样觉得的。。。

亚洲必赢app在哪下载 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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢app官方下载 版权所有