美文网首页工作生活
JSON、序列化与反序列化

JSON、序列化与反序列化

作者: 刘建Chris | 来源:发表于2019-07-05 01:41 被阅读0次

一、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解决(待探索)

相关文章

网友评论

    本文标题:JSON、序列化与反序列化

    本文链接:https://www.haomeiwen.com/subject/zpkjhctx.html