JSON的理解

2018-04-09  本文已影响9人  dominghao

JSON (JavaScript Object Notation JS对象标记) 是一种轻量级的数据交换格式. 它采用完全独立于编程语言的文本格式来存储和表示数据.

class ModelObject{
        let name:String?
        let password:String?
    //我们实际开发中用到的模型要比这复杂,这里简单化
        init(name:String, password:Stirng){
            self.name = name
            self.password = password
        }
    
        init()
        {
            name = nil
            password = nil
        }
}

假设你是移动APP端的开发者, 既然是一种数据数据交换格式,那肯定是前端与后端之间的数据交换. 你获取用户输入的name 和 passWord 并初始化得到一个ModelObject对象. 现在你需要把这个对象发送到后台去.
怎么做?
直接发送行不行? 要知道我们的数据都是以二进制的形式存储在内存或者磁盘上的(这是数据的物理表现形式), 数据可能有不同的逻辑表现形式(我们定义不同的类就是从逻辑形式上定义数据,但本质上它的物理表现形式是不会变的), 010101010的电信号... 也就是二进制流. 暂且这么理解.
理论上,如果你直接发送一个ModelObject对象的二进制也是可以的.前提是后台拿到这个二进制的ModelObject对象,读取并无误的转换成自己所在环境的一个所需要的对象, 如果哪天前后端统一了所有的语言, 或者有一个所有语言都支持的统一的框架,可以自动识别不同语言的二进制对象,并且转换成在该语言环境下的对象.
目前我们应该怎么做?
我们应该首先把ModelObject对象转换成一个字典,然后通过方法把字典转换成JSONData.

  1. 为什么需要转成字典呢? 因为Objective-C或者Swift中没有前面提到的那种直接把对象转换成对应的JSON字符串的方法.而JSON在Objective-C中恰恰对应Foundation中的dictionary.
  2. 为什么要把字典转换成JSONData? 因为网络上传输数据只能通过二进制流的方式进行传递. 这里要注意统一编码.不过这里传递的是字符流,字符是通过二进制来表示的.

但是这里的二进制字符流是由特定格式的,是一种叫做JSON的数据交换格式.

后台

由于我没有做过后台,具体的处理流程不清楚. 不过我猜测 ,也是响应了请求,拿到了请求中的二进制数据, 然后根据JSON的规则解析,来还原对象的值.

最后Objective-C中的JSON的解析:

在Objective-C中使用NSJSONSerialization在JSONObject(事实上就是Foundation对象)和JSONDate(JSON格式的字符串<以二进制形式存在,这也是我们网络请求后直接得到的东西>)之间进行转换.
这里只是简单的使用方法举例,具体说明请参考NSJSONSerialization

  • JSONObjectWithData:options:error:
    Returns a Foundation object from given JSON data.
    Declaration

反序列化:将从服务器接收到的二进制数据转换成 NSDictionary / NSArray 的过程,简化程序开发,便于后续的字典转模型

//NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];  
NSDictionary *resultDic1 = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];  
//得到一个Foundation对象,便于接下来转成响应的模型.
  • dataWithJSONObject:options:error:
    Returns JSON data from a Foundation object.
    Declaration

序列化:
将字典或者数组发送给服务器之前,转换成二进制数据,方便网络传输。

NSData  *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObj options:NSJSONWritingPrettyPrinted error:&error];  
//NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

目前还在学习的道路上...
参考:

  1. http://www.cnblogs.com/QianChia/p/5760880.html
  2. https://blog.csdn.net/a547720714/article/details/66968414
上一篇 下一篇

猜你喜欢

热点阅读