概述

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

iOS开发系列-JSON解析的更多相关文章

  1. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  2. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  3. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  4. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  5. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  6. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  7. iOS开发系列之app的一天

    本文主要讲述我对 iOS 开发的一些理解,希望能通过 app 从启动到退出,将一些的知识整合起来,形成一条知识链,目前涉及到的知识点有 runloop.runtime.文件存储.界面布局.离线推送.内 ...

  8. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  9. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

随机推荐

  1. NX二次开发-UFUN移动工程图视图UF_DRAW_move_view

    #include <uf.h> #include <uf_draw.h> #include <uf_drf.h> #include <uf_obj.h> ...

  2. Matlab中的lambda表达式 f=@(x) x^2-2*x+1;

    Matlab中的lambda表达式 f=@(x) x^-*x+;

  3. Java-Class-C:org.springframework.http.converter.StringHttpMessageConverter

    ylbtech-Java-Class-C:org.springframework.http.converter.StringHttpMessageConverter 1.返回顶部 1.1. impor ...

  4. 洛谷P3916 图的遍历

    题目链接:https://www.luogu.org/problemnew/show/P3916 题目大意 略. 分析 以终为始,逆向思维. 代码如下 #include <bits/stdc++ ...

  5. 过滤'and','or' ''' '*' '=' ‘select’下的注入

    遇到一个站:http://www.马赛克.net/intro.aspx?id=6 加了单引号  http://www.马赛克.net/intro.aspx?id=6‘  页面无变化 加了双引号   h ...

  6. VO和DO的区别

    阿里巴巴Java开发手册中的DO.DTO.BO.AO.VO.POJO定义 分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Da ...

  7. 13-Ubuntu-查阅终端命令版本信息和帮助信息

    查看版本信息: 终端命令 --version 查看帮助信息: 终端命令 --help 注: 待查阅的命令 后面有两个减号-- 例:查看终端命令ls的版本和帮助信息 ls --version ls -- ...

  8. shell 命令 用户管理

     1. 查看保存用户相关信息的文件 [ cat /etc/passwd ]  [linux    :    x    :   1000  :   1000   :   linux,,,   :    ...

  9. vue v-show指令

    demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. 新建Application 报错android.app.Application cannot be cast

    我在开发APP的时候重新使用了一个类,继承了android.app.Application.但是在运行的时候提示java.lang.ClassCastException: android.app.Ap ...