天天看点

如何在 Swift 中优雅地处理 JSON 【已翻译100%】

因为swift对于类型有非常严格的控制,它在处理json时是挺麻烦的,因为它天生就是隐式类型。swiftyjson是一个能帮助我们在swift中使用json的开源类库。开始之前,让我们先看一下在swift中处理json是多么痛苦。

在swift中使用json的问题

以twitter api为例。使用swift,从tweet中取得一个用户的“name”值应该非常简单。下面就是我们要处理的json:

在swift中,你必须这样使用:

或者,你可以用另外的一个方法,但这不易于阅读:

开始

下载在这儿下载swiftyjson,或者直接在github克隆它:

基础用法

swiftyjson的使用十分的简单:

典型的nsurlsessiontask抓取twitter的api将产生datafromnetwork: nsdata!:

你首先应该做的事情是初始化jsonvalue:

jsonvalue是一个枚举类型表示一个典型的json数据结构。

你能使用subscripts检索不同的值从原始的jsonvalue中,像这样:

注意username仍然是一个jsonvalue。那怎样得到一个字符串呢?

你能用.string属性得到json数据表示的真正值。

对每一种json类型, jsonvalue都提供了一种属性检索它:

注意每一种属性都是一个optional值。这是因为json数据能包含任何它定义的有效类型。

因此,建议的方式是用optional绑定检索值:

.number属性产生一个nsnumber值,在swift中这通常不是很有用。你能用.double或者.integer得到一个double值或者一个int值。

枚举(enumeration)

在swift中jsonvalue实际上是一个枚举:

enum jsonvalue {

}

你可以使用一个switch子句去更有效地获取值:

let json = jsonvalue(jsonobject)

switch json["user_id"]{

case .jstring(let stringvalue):

case .jnumber(let numbervalue):

default:

下标(subscripts)

注意,在json中一个数组结构被包装成intoarray,它意味着数组里的每一个元素都是一个jsonvalue。甚至你从jsonvalue中取出一个数组,你仍然可以使用基本的属性去获取元素的值:

对象也是一样。因此,推荐的方式是访问每一个数组和对象时使用jsonvalue的下标。

实际上,你可以用下标访问一个jsonvalue,还不用担心运行时错误导致的崩溃:

如果你使用推荐的方式去取数据,它是安全的:

打印

jsonvalue遵守printable协议.所以很容易在原始字符串中得到json数据:

let json = jsonvalue(datafromnetwork)

println(json)

/*you can get a well printed human readable raw json string:

*/

如果你不想打印出来,你可以使用.description属性来得到上述字符串。

调试与错误处理

要是json数据出错或者我们错误地检索数据,那会怎么样呢?你可以使用if语句来测试:

如果我们尝试使用错误的键值或索引来访问数据,description属性会高数你keypath在哪里出错了.

后记

swiftyjson的开发将会发布在github, 请持续关注后续版本。