代码改变世界

iOS开发系列-JSON解析

2018-04-21 00:39  iCoderHong  阅读(1054)  评论(0编辑  收藏  举报

概述

JOSN是一种轻量级的数据格式,一般用于数据交互。服务器返回给客户端,一般都是JSON格式或者XML格式。

JSON的格式:
{"name" : "CoderHong", "age": "12"}
{"names" : ["CoderHong", "Rose", "Jake"]}

标准的JSON格式建议使用key必须双引号,如果使用单引号有些第三方框架解析过程会出现问题。

JSON解析

JSON在转换过程中JSON中的数据类型都会转成OC对象。JSON数据类型与OC对象的的映射表。

JSON解析方案

在iOS 5.0之前,开发中使用有很多的第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右依次降低)。
在iOS 5.0之后,苹果提供了原生 NSJSONSerialization。目前性能最好,开发建议使用。

NSJSONSerialization常见方法

反序列化
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

1. 参数data必须是可以反序列化的 并且返回error信息

2. 参数data不能为nil,否者抛出异常

返回值为OC的id类型。第二个参数是一个枚举取值为:

  • NSJSONReadingMutableContainers 返回的是一个可变的对象(容器)
  • NSJSONReadingMutableLeaves 返回的是一个可变的对象(容器),并且里面的小节点容器也是可变的
  • NSJSONReadingAllowFragments 允许最外面返回的不是必须是字典或者数组可以直接返回NSNumber。

如果服务端返回标准的JOSN数据,并且不要求返回的是可变数组或字典传递kNilOptions效率最高。

序列化

将OC中的对象(字典,数组)转成JSON字符串

+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

第一个参数OC中的字典或数组对象。第二个参数是一个枚举值,取值有NSJSONWritingPrettyPrinted、NSJSONWritingSortedKeys,主要用于在控制台数据的格式。可以传递NSJSONWritingPrettyPrinted输出的JSON字符串是有数据格式的。

注意:如果该方法传入的obj不是有效的JSON会内部会抛出异常,程序奔溃

因此在调用方法先使用NSJSONSerialization类方法做检查,避免奔溃。

实例:

NSDictionary *dict = @{@"name": @"CoderHong", @"age": @(12)};
BOOL isValid = [NSJSONSerialization isValidJSONObject:dict];
if(isValid){
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingSortedKeys error:nil];
    NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}    

字典转模型框架

字典转模型根据时间顺序常用的框架 Mantle、 JOSNModel、MjExtension。
JSONModel框架使用时需要工程中的模型继承JOSNModel。
MJExtension框架使用时不需要工程中的模型继承,性能最好。