zoukankan      html  css  js  c++  java
  • iOS开发系列-JSON解析

    概述

    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框架使用时不需要工程中的模型继承,性能最好。

  • 相关阅读:
    ztree : 增删改功能demo与自定义DOM功能demo的结合
    CF786B Legacy 线段树优化建图
    UVA11992 Fast Matrix Operations 一次开多棵线段树
    P3950 部落冲突 树链剖分
    洛谷P1471 方差 线段树维护区间方差
    2019.7.26 T1 树剖+双标记
    P1505 [国家集训队]旅游
    NOIP2015 运输计划 树上差分+树剖
    P1373 小a和uim之大逃离 四维dp,维护差值
    Pyhton之subprocess模块和configparser模块
  • 原文地址:https://www.cnblogs.com/CoderHong/p/8895026.html
Copyright © 2011-2022 走看看