这种数据,如果你打开了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"]}区别就在这,这下明白了吧。