JSON

 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;
// 成功拿到数据,解析JSON
id 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
  • 说明 : 以上三个框架的性能依次降低!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值