一、JSON
JSON是一种轻量级的数据结构,很多语义里,指的是json字符串
JSON: 一种轻量级的数据结构
JSON字符串:格式为json的字符串
JSON对象:javascript语言里的对象,可以操作其属性等
JSON数据类型及与OC数据结构 对应关系:
@YES/@NO,是NSNumber类型, OC处理时候,即可视为@(1)/@(0)二、序列化与反序列化
2.1 序列化:
[NSJSONSerialization +dataWithJSONObject: options: error:]
可以序列化的object条件
1. 对象顶层只能是NSArray 或 NSDictionary
2. 对象只能是NSString, NSNumber, NSArray, NSDictionary, or NSNull这5个类型
3. 字典的key 必须是字符串
4. NSNumbers 不能是非数 或 无穷大
检测一个object是否可以序列化
[NSJSONSerialization isValidJSONObject:]
options
1. NSJSONWritingPrettyPrinted 漂亮的排版
2. NSJSONWritingSortedKeys 特定的排序(IOS11)
2.2 反序列化:
[NSJSONSerialization +JSONObjectWithData: options: error:]
options:
1. NSJSONReadingMutableContainers :得到的对象,以及对象里面的容器类(字典或者数组)都是可变的
2. NSJSONReadingMutableLeaves : 得到的对象中字符串是可变的,文档中说的是leaf strings ->NSMutableString,测试中即使不用这个选项字符串也是NSTaggedPointerString,也是可变字符串,所以文档中说的leaf strings到底是什么字符串有待研究
3. NSJSONReadingAllowFragments 返回的对象整体可以即不是字典也不是数组(比如是null), 不知道怎么测试,data传nil,整个方法就崩了
2.3 异常
NSJSONSerialization解析,NSNumber 转 JSON的浮点型数据,或者JSON的浮点型数据 转 NSNumber,会出现浮点型数据精度丢失问题
如:JSON数据 {\"71.50\":71.5},转换后却变为{"71.40" = "71.40000000000001"}
原因:[NSNumber -floatValue] 有精度丢失问题 ([NSString -floatValue]也有精度丢失问题);另外,我猜测, json里面的数字,转为NSNumber时候,也会经历转float类型,这时候也出现精度丢失问题;即OC中任何类型转化为浮点型数值,都会出现精度丢失问题, 如果想不丢失,需要自己设置精度
比如:NSLog(@"%f", 123.9); 打印结果却为:123.900002
要想打印出想要的效果,必须自己设置精度,如:NSLog(@"%0.1f", 123.9);
解决:
1. 浮点型数据,后台传字符串格式,防止精度丢失
2. 用NSDecimalNumber解决(待探索)
网友评论