JSON 解析


JSON 介绍

JSON 本质上,就是一个"特殊格式"的字符串

  • JSON 是网络上用来传输数据使用最广泛的数据格式,没有之一

  • JSON 出身草根,是 Javascript 的子集,专门负责描述数据格式

  • Javascript 是做网页开发使用的一种"脚本"语言

  • Javascript & Java 没有任何关系!

参考网站:http://www.w3cschool.cc

JSON 语法规则

  • 数据以 key/value 值对表示

  • 数据由逗号分隔

  • 花括号保存对象

  • 方括号保存数组

JSON 值

  • 数字(整数或浮点数)

  • 字符串(在双引号中)

  • 逻辑值(true 或 false

  • 数组(在方括号中)

  • 对象(在花括号中)

  • null

序列化 & 反序列化

  • 序列化:在向服务器发送数据之前,将 NSArray / NSDictionary 转换成二进制的过程

  • 反序列化:在从服务器接收到数据之后,将二进制数据转换成 NSArray / NSDictionary 的过程

JSON 反序列化

  • 天气预报接口

NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];NSLog(@"%@ %@", result, [result class]);
选项说明
NSJSONReadingMutableContainers = (1UL << 0)容器可变
NSJSONReadingMutableLeaves = (1UL << 1)叶子可变
NSJSONReadingAllowFragments = (1UL << 2)顶级节点可以不是 NSArray 或者 NSDictionary
  • 在实际开发中,获得网络的数组或者字典之后,通常会做字典转模型!反序列化的结果是否可变并不重要

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

NSJSONSerialization 类
  • 专门负责在 JSON 和 Foundation 对象直接转换的类

  • 可以转换成 JSON 的 Foundation 对象需要具备以下条件:

    • 顶级节点是 NSArray 或者 NSDictionary

    • 所有的对象是 NSStringNSNumberNSArrayNSDictionary 或者 NSNull

    • 所有字典的 key 是 NSString

    • NSNumber 不是空或者无穷大


JSON 解析第三方框架

常见的 JSON 解析第三方框架

  • JSONKit(最快)

  • SBJson

  • TouchJSON

以上三个框架的性能依次降低!

介绍 JSONKit 第三方框架的目的

  1. JSON 的解析并不是表面上那么简单

  2. 官方说 JSONKit 比苹果原生的 JSON 解析速度快!

  3. JSONKit 在很多老的项目中仍然在使用

  • 知道 JSONKit 说明我们是 iOS 程序

JSONKit 适用于 iOS 5.0 以前的版本开发使用

了解 ARC & MRC 混编的方法

步骤

下载框架 https://github.com/johnezang/JSONKit

导入框架文件

  • JSONKit.h

  • JSONKit.m

设置 MRC 标记

  • 可以告诉编译器,编译 JSONKit.m 时不使用 ARC

  • 选择"项目"-"Build Phases"-"Compile Sources"

  • 找到 JSONKit.m 并且在 Compiler Flags 中添加 -fno-objc-arc

修改错误

  • 利用自动修复功能,修改两处 isa 的错误

反序列化

id result = [[JSONDecoder decoder] objectWithData:data];

性能测试

static int largeNumber = 100 * 1000;

- (void)jsonKitDemo {    NSString *urlString = @"http://localhost/demo.json";
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    NSURL *url = [NSURL URLWithString:urlString];    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {        NSLog(@"start");
        CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();        for (int i = 0; i < largeNumber; ++i) {            id result = [[JSONDecoder decoder] objectWithData:data];
        }        NSLog(@"%f", CFAbsoluteTimeGetCurrent() - start);        // 数据处理代码...
    }];
}

测试结果:

  • 时间:3.24s

  • 内存:4.74G

苹果原生框架

  • 时间:0.18s

  • 内存:几乎不变

重要提示:进入公司,如果仍然还在使用老的框架解析 JSON,可以直接替换成苹果原生的解析


转载于:https://my.oschina.net/venn0126/blog/551490

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值