简介
JSON 是移动端目前最常用的数据交换格式,它具有易于阅读,易于编写,体积小的优点。目前,大部分的编程语言都支持这种数据格式,因此,它也具有跨语言、跨平台的特点。
参考
语法
JSON 数据只有两种结构:
键值对的集合
ObjC 中被理解为字典,以 "{" 开头,键值之间以 ":" 分隔,键值对之间以 "," 分隔,最后以 "}" 结尾 ,形如:
{ key: value, key: value, key: value, ... }
值的有序列表
ObjC 中被理解为数组,以 "[" 开头,值之间以 "," 分隔,最后以 "]" 结尾,形如:
[ value, value, value, ... ]
数据类型
键 (key) 只能是字符串 (string);值 (value) 可以是字符串 (string) 、数值 (number) 、true、false、null、字典 (dictionary) 或者数组 (array) 。
示例
// 字典
{
"name": "Jack",
"age": "30",
"gender": "male"
}
复制代码
// 数组
[
1, 2, 3, 4, 5, 6
]
复制代码
// 字典与数组嵌套
{
"status": "success",
"data": [
{
"name": "Jack",
"age": 30,
"gender": "male"
},
{
"name": "Shirley",
"age": 25,
"gender": "female"
},
{
"name": "Tom",
"age": 22,
"gender": "male"
}
]
}
复制代码
注意:字典最后一个键值对不能带逗号,数组最后一个元素不能带逗号。
序列化
iOS 开发中一般使用 NSJSONSerialization 类进行 JSON 数据的序列化操作,它是 Foundation 框架中的一个工具类。
JSON 转对象
NSString *jsonStr = @" \
{ \
\"name\": \"Jack\", \
\"age\": 30, \
\"gender\": \"male\" \
}";
NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
// 转换
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];
// 输出
NSLog(@"%@ : %@", NSStringFromClass([jsonObj class]), jsonObj);
复制代码
参数 opt 是一个 NSJSONReadingOptions 枚举类型,定义如下:
typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
NSJSONReadingMutableContainers = (1UL << 0),
NSJSONReadingMutableLeaves = (1UL << 1),
NSJSONReadingAllowFragments = (1UL << 2)
}
复制代码
- NSJSONReadingMutableContainers 表示会使用 NSDictionary、NSArray 的可变形式 NSMutableDictionary、NSMutableArray 进行 JSON 数据解析。
- NSJSONReadingMutableLeaves 会使用 NSMutableString 替代 NSString 进行解析,目前测试没有效果,不建议使用。
- NSJSONReadingAllowFragments 这个值比较有意思,它可以允许解析的数据不是有效的 JSON 格式,但必须是格式正确的 JSON 片段。
对象转 JSON
NSDictionary *people = @{ @"name" : @"Jack",
@"gender" : @"male",
@"age" : @30
};
// 转换
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:people options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonStr);
复制代码
NSJSONWritingPrettyPrinted 会将 JSON 数据写成便于打印的格式,如果不传入这个参数,输出就是这样:
在网络开发中,一般会使用 JSON 转模型的框架,如 YYModel、MJExtension、Mantle,它们能够减少重复的数据解析代码,同时还具有类型检查、类型转换的额外功能,使用这些框架能够大幅提高工作效率。