NSJSONSerialization,JSON数据解析API
JSON和Foundation objects之间相互转换的API, 支持ARC, iOS 5+
JSON文档的要求:所有的key都是双引号,不能使用单引号或没有引号
object的要求:
- 顶级节点的数据类型必须是 __NSArray__ 或者 __NSDictionary__
- 所有节点必须是以下实例: __NSString__, NSNumber, NSArray, NSDictionary, or __NSNull__
- 所有节点的key必须是 __NSString__
- Numbers 不能是 NaN 或者 infinity
isValidJSONObject:
,判断是否可以正确转换
JSONObjectWithData:options:error:
,A Foundation object from the JSON data in data, or nil if an error occurs.
JSON 文档的字符编码只能是 UTF 系
NSJSONReadingOptions
包含三种类型:
- NSJSONReadingMutableContainers,返回可变容器,__NSMutableDictionary__ 或 __NSMutableArray__
- NSJSONReadingMutableLeaves,叶节点都转成 __NSMutableString__,目前在 iOS 7 上测试不好用,应该是个 bug,参见:- http://stackoverflow.com/questions/19345864/nsjsonreadingmutableleaves-option-is-not-working
- NSJSONReadingAllowFragments,允许顶层节点不是 __NSArray__ 或者 __NSDictionary__,但必须是有效的 JSON Fragment,如解析
@"123"
这样的字符串。That’s because 32 is a valid JSON fragment (a number), but abcd is not a valid JSON fragment since all strings must be quoted.
NSString *num=@"32";
NSString *num=@"\"abcd\"";
JSONObjectWithStream:options:error:
,通过数据流解析
__NSInputStream__ 数据流必须是可被打开和配置。
dataWithJSONObject:options:error:
,创建 JSON data
如果对象不能正确生成 JSON data,将抛出一个 programming error,并非 internal error,This exception is thrown prior to parsing and represents a programming error。
而 API 里设定的 __error__,If an internal error occurs, upon return contains an NSError object that describes the problem.
所以,在生成 JSON data 之前,需要检查是否能够正确 isValidJSONObject:
NSJSONWritingOptions
,
- NSJSONWritingPrettyPrinted,指定输出 JSON data 是否执行 pretty print.