概述
You use the NSJSONSerialization class to convert JSON to Foundation objects and convert Foundation objects to JSON.
官方文档给出的解释如上。在现在流行架构中开发移动端项目,这个类是基本上大家都会用到的,所以有必须要仔细学习一下。
一个对象要转成JSON,必须满足下列条件:
- 顶级对象是NSArray或者NSDictionary
- 所有的对象都必须是NSString, NSNumber, NSArray, NSDictionary或者NSNull类的实例
- 所有的字典Keys都是NSString的实例
- 所有的数字都不是NaN(Not a Number)或者无穷大
也可能还有其他的规则。调用
isValidJSONObject
或者尝试转换一下才是决定对象是否能被转换为JSON的最终方法。
Foundation对象转化为JSON
+ dataWithJSONObject:options:error:
这里是转化为JSON,所以options是NSJSONWritingOptions
,里面只有一个Enum是NSJSONWritingPrettyPrinted
,意思是生成的JSON会以设计好的带空格的格式展示,比较可读;不设置的话(一般就是0,也可以定义一个字面常量来表示)就是最紧凑的JSON写法。
+ writeJSONObject:toStream:options:error:
与第一个方法类同,只是直接将Foundation对象写入流
+ isValidJSONObject:
用来判断是否是合规的可以转为JSON的Foundation对象
从JSON创建Foundation对象
+ JSONObjectWithData:options:error:
这里是读取JSON,所以options是NSJSONReadingOptions
,有三个Enum值:
-
NSJSONReadingMutableContainers
从JSON创建的arrays和dictionaries是mutable的 -
NSJSONReadingMutableLeaves
从JSON创建的对象表的叶子字符串是可变字符串 -
NSJSONReadingAllowFragments
解析器允许最顶级对象不是NSArray或者NSDictionary的实例
上面的Enum值都是用来规定读取的对象的格式,以方便你后续操作想要修改结果(对于这做法的必要性表示不太理解,即便是返回immutable的,仍然后续自己变成mutable,为什么要在api中加参数来解决?)
+ JSONObjectWithStream:options:error:
与第一个方法类同,只是从流中直接创建Foundation对象