JSON

来源:互联网 发布:不会函数能学编程吗 编辑:程序博客网 时间:2024/04/29 06:33

 JSON 简介

  • JavaScript Object Notation (JavaScript的对象表示法).
  • JSON 本质上,就是一个"特殊格式"的字符串.
  • JSON 是网络上用来传输数据使用最广泛的数据格式,没有之一.JSONXML更轻量级.
  • JSON 出身草根,是 Javascript 的子集,专门负责描述数据的一种格式.
  • Javascript 是做网页开发使用的一种"脚本"语言.
  • Javascript & Java 没有任何关系!
  • 参考网站:http://www.w3cschool.cc
  • JSON具有自我描述性,更易理解.

 

   JSON 语法规则

  • 数据以 key/value 值对表示
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组
  • 提示 : JSON描述对象的语法格式很像字典.但是,不是字典,仅仅是键值对的形式很像.
1
2
{} 对象 {"key""value","name""zhangjie"}
[] 数组 [{},{}]

 

JSON 值

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null (空值)

JSON描述对象

  • 新建工程,新建文件demo.json

  • 描述一个学生

复制代码
{    "name":"赏金猎人",    "age":"18"}// 描述一个另学生{    "name":"莫甘娜",    "age":19}- 描述多个学生[    {        "name":"金克斯",        "age":"18"    },    {         "name":"武器大师",         "age":"19"    },    {         "name":"邪恶小法师",         "age":"20"    }]
复制代码

JSON解析_NSJSONSerialization

  • 问什么要解析JSON数据?
    • 因为从服务器获取到的JSON数据都是二进制的,客户端无法直接使用,就需要将二进制的JSON数据转换成客户端可以直接使用的OC对象.
    • 注意 : JSON形式的字符串客户端也无法直接使用.还是需要将其转换成OC对象.

序列化 & 反序列化

  • 序列化: 在向服务器发送数据之前,将NSArry/NSDictionaryOC对象转换成二进制的过程.
  • 反序列化: 在从服务器接收到数据之后,将二进制数据转换成NSArray/NSDictionaryOC对象的过程.
  • JSON解析也叫做JSON反序列化

JSON解析 & JSON反序列化

  • 加载demo.json文件中的JSON数据
复制代码
- (void)loadJSON{    // 获取请求    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/demo.json"];    // 创建请求    NSURLRequest *request = [NSURLRequest requestWithURL:url];    // 发送异步请求,获取JSON数据    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {        // 判断链接是否出错        if (connectionError) {            NSLog(@"链接出错");            return;        }        // 判断响应是否出错        NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response;        if (HTTPURLResponse.statusCode == 200 || HTTPURLResponse.statusCode == 304) {            // data : 二进制,本质是JSON字符串            // JSON序列化 : 将对象序列化成JSON字符串            // JSON解析 : JSON反序列化,将二进制形式的JSON字符串转换成对象            // 保存解析错误时的信息            NSError *error;            // 成功拿到数据,解析JSON            id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];            // 判断解析是否出错            if (error) {                NSLog(@"解析出错 %@",error);                return;            }            // 解析正确            NSLog(@"json类型 %@ json %@",[json class],json);        } else {            NSLog(@"服务器内部出错");            return;        }    }];}
复制代码

JSON解析 & JSON反序列化 的核心部分

复制代码
// 保存解析错误时的信息NSError *error;// 成功拿到数据,解析JSONid json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];// 判断解析是否出错if (error) {    NSLog(@"解析出错 %@",error);    return;}// 解析正确NSLog(@"json类型 %@ json %@",[json class],json);
复制代码

总结

  • 打印 json 类型的结果是 __NSCFDictionary,表示字典.
  • NSJSONSerialization 自动将二进制形式的JSON字符串解析成了字典.

  • JSON解析返回的对象是字典数组,是根据原始数据是由 {} 或者 [] 括起来决定的.

  • 如果JSON数据中有中文,输出的是经过Unicode编码的内容,无法识别.
  • 解析JSON最终的目的?

JSON解析_options

id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

options参数说明

  • NSJSONReadingOptions
选项说明NSJSONReadingMutableContainers = (1UL << 0)容器可变NSJSONReadingMutableLeaves = (1UL << 1)叶子可变NSJSONReadingAllowFragments = (1UL << 2)顶级节点可以不是 NSArray 或者 NSDictionary,但必须是有效的JSON内容,比如字符串必须带引号
  • 在实际开发中,获得网络的数组或者字典之后,通常会做字典转模型!反序列化的结果是否可变并不重要

选项选择 0,表示任何附加操作都不做,效率最高!

NSJSONSerialization 类

  • 专门负责在 JSON 和 Foundation 对象直接转换的类
  • 可以转换成 JSON 的 Foundation 对象(即能够做JSON序列化的对象)需要具备以下条件:
    • 顶级节点是 NSArray 或者 NSDictionary
    • 所有的对象是 NSStringNSNumberNSArrayNSDictionary 或者 NSNull
    • 所有字典的 key 是 NSString
    • NSNumber 不是空或者无穷大
 

JSON解析_转模型

  • 解析JSON最终的目的是字典转模型.
  • NSJSONSerialization 解析完JSON之后.打印 json 类型的结果是 __NSCFDictionary,表示字典.

模型类声明

 

复制代码
@interface MessageModel : NSObject@property (nonatomic,copy) NSString *messageId;@property (nonatomic,copy) NSString *message;/// 字典转模型的方法+ (instancetype)messageWithDict:(NSDictionary *)dict;@end
复制代码

模型类实现

复制代码
@implementation MessageModel/// 字典转模型+ (instancetype)messageWithDict:(NSDictionary *)dict{    MessageModel *model = [[MessageModel alloc] init];    // KVC字典转模型    [model setValuesForKeysWithDictionary:dict];    return model;}/// 输出自定义对象- (NSString *)description{    return [NSString stringWithFormat:@"%@ {messageId:%@, message:%@}",[super description],self.messageId,self.message];}@end
复制代码

字典转模型

复制代码
NSError *error;// 成功拿到数据,解析JSON// id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];// 解析出来的是字典对象// NSLog(@"json类型 %@ json %@",[json class],json);NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];if (error) {    NSLog(@"解析出错 %@",error);    return;}// 字典转模型MessageModel *model = [MessageModel messageWithDict:jsonDict];NSLog(@"%@",model);
复制代码

常见的 JSON 解析第三方框架

  • JSONKit(最快)
  • SBJson
  • TouchJSON
  • 说明 : 以上三个框架的性能依次降低!
0 0
原创粉丝点击