Swift 与 JSON 数据

By admin in 亚洲必赢app在哪下载 on 2019年2月14日

咱俩大家经常在开发 App 的时候,相信接触最多的就是 JSON 数据了。只要您的
App 有读取网络数据的作用,你就免不了要与 JSON 打交道。比如您做三个新闻App,你要读取和剖析音讯数据,这样才能突显给用户。

那么我们明日就来打听一下 JSON 以及它在 App 中的应用吧。

在前两节大家会介绍 JSON 数据格式,即使你已经对 JSON
相比通晓了,那么也可以跳过前两节,继续读书前边的情节。

什么是 JSON

第1、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"]
}

地点的数据示例,表示了如此3个协会,首先大家的数量被一对大括号包围,那么大家的数目就是
对象
类型,然后它其中有八个属性,firstname,lastname,age,friends
其中前多少个属性 firstnamelastname 字符串类型,他们的值分别是
SanZhangage 属性代表年龄,所以它的值一个 Number 类型的
21

小心一下,字符串类型和数字品类的分化,字符串类型的值用一对双引号括了起来,而数值类型不须要双引号。

最后,friends
属性的值是3个数组,用一对中括号包围起来,而数组中的成分,仍旧是字符串类型。

如上就是 JSON 的3个主导社团,关于 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
}

小编们来容易看一下,数据总体采纳一对大括号包围的,也等于说再次回到给大家的多寡,是一个
亚洲必赢app在哪下载,JSON 对象 紧接着,这几个目的涵盖了 coord
属性,这一个性情的值又是2个对象,里面有八个属性 ‘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) 来讲气候接口包装成
    NSU凯雷德L。

  2. 下一场,大家接纳 let jsonData = NSData(contentsOfURL: url) 将以此
    UEnclaveL 的始末读取下载,存放到 NSData 中。

  3. 接下去,我们将要动用 NSJSONSerialization 将那些多少解析成 JSON
    了。
    let jsonObj:NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.allZeros, error: nil) as? NSDictionary
    那里大家 JSONObjectWithData 方法将盛传的 NSData 数据解析成 JSON
    对象,倘诺大家的 JSON
    根节点是以目的情势存放的,那么大家赢得的就是三个
    NSDictionary。而只如若以数组方式存放的,那么我们拿到的就是3个
    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
数据,觉得用起来很爽吧。仔细回顾一下,大家刚刚还注意到有3个 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 数据的根层级,不是数组和对象。

额。。 听起来怪怪的糟糕掌握是吗。

本条选项确实简单引起歧义,包含她的名称
AllowFragments,翻译成汉语叫允许碎片,
什么叫允许碎片呢,小编再自身实施商讨过这些前边作者一贯是这么觉得的。。。

亚洲必赢app在哪下载 6

AllowFragments 的情致,是否足以分析那样的 JSON?

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

一段时间以来本人的思辨里是这么想的。可惜完全不是那么回事儿,尽管你将那样的
JSON 数据传给 JSONObjectWithData
方法,你将获取二个狂暴的剖析错误。。。

那就是说,那东西到底是为何用的哟~

实质上官方文档上面说的清晰,可以让跟节点不是目标或然数组。在 JSON
中唯有两种档次,对象,数组,值。

实际上简单就是那样,允许你的 JSON
数据是2个字面值,比如字符串,数字,等等。

比如说我们可以流传一个土生土长的字符串

"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-2019 亚洲必赢app官方下载 版权所有