JSON (JavaScript Object Notation JS对象标记) 是一种轻量级的数据交换格式. 它采用完全独立于编程语言的文本格式来存储和表示数据.
-
JSON 和 JS 的关系
JSON 是JS对象的字符串表示法,它使用文本表示一个JS对象的信息.JSON本质上是一个具有特定格式字符串, 在JS语言中使用JSON.stringify()方法把对象转换为JSON字符串(就是字符串!). 事实上, JSON作为一种完全独立于语言的数据交换格式 广泛用于许多场合, 许多语言都有对应的JSON数据格式的解析框架. -
为什么是JSON!
无论是移动端APP还是Web端(这里统称为"前端"),都需要和后台进行数据交换.
假设一个登陆场景:我们需要把用户名和密码通过网络请求发送给后台,后台返回我们一个token.
事实上我们和后台进行交换的数据要比这复杂,这里首先定义一个ModelObject类存放我们需要向后台发送的数据.
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.
- 为什么需要转成字典呢? 因为Objective-C或者Swift中没有前面提到的那种直接把对象转换成对应的JSON字符串的方法.而JSON在Objective-C中恰恰对应Foundation中的dictionary.
- 为什么要把字典转换成JSONData? 因为网络上传输数据只能通过二进制流的方式进行传递. 这里要注意统一编码.不过这里传递的是字符流,字符是通过二进制来表示的.
但是这里的二进制字符流是由特定格式的,是一种叫做JSON的数据交换格式.
后台
由于我没有做过后台,具体的处理流程不清楚. 不过我猜测 ,也是响应了请求,拿到了请求中的二进制数据, 然后根据JSON的规则解析,来还原对象的值.
最后Objective-C中的JSON的解析:
在Objective-C中使用NSJSONSerialization在JSONObject(事实上就是Foundation对象)和JSONDate(JSON格式的字符串<以二进制形式存在,这也是我们网络请求后直接得到的东西>)之间进行转换.
这里只是简单的使用方法举例,具体说明请参考NSJSONSerialization
- Creating a JSON Object:
- JSONObjectWithData:options:error:
Returns a Foundation object from given JSON data.
Declaration
- (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError * _Nullable *)error;
Parameters
data
A data object containing JSON data.
opt
Options for reading the JSON data and creating the Foundation objects.
For possible values, see NSJSONReadingOptions.
error
If an error occurs, upon return contains an NSError object with code NSPropertyListReadCorruptError that describes the problem.
Return Value
A Foundation object from the JSON data in data, or nil if an error occurs.
反序列化:将从服务器接收到的二进制数据转换成 NSDictionary / NSArray 的过程,简化程序开发,便于后续的字典转模型
//NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *resultDic1 = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];
//得到一个Foundation对象,便于接下来转成响应的模型.
- Creating JSON Data
- dataWithJSONObject:options:error:
Returns JSON data from a Foundation object.
Declaration
- (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError * _Nullable *)error;
Parameters
obj
The object from which to generate JSON data. Must not be nil.
opt
Options for creating the JSON data.
See NSJSONWritingOptions for possible values.
error
If an internal error occurs, upon return contains an NSError object with code NSPropertyListWriteInvalidError that describes the problem.
Return Value
JSON data for obj, or nil if an internal error occurs. The resulting data is encoded in UTF-8.
序列化:
将字典或者数组发送给服务器之前,转换成二进制数据,方便网络传输。
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObj options:NSJSONWritingPrettyPrinted error:&error];
//NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
目前还在学习的道路上...
参考:
网友评论