美文网首页工作生活
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