• iOS 网络编程:JSON解析


    1 JSON文档结构

    1.1 简介

           JSON(javaScript Object Notation)是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析,是一种轻量级的数据交换格式。所谓轻量级是指与XML文档结构相比描述相同的数据所需的字符个数要少。

        简单的说JSON由两种数据类型组成数组词典

    1.2 语法

          JSON 语法是 JavaScript 语法的子集,但对于IOS开发来说,可以不需要太多了解JavaScript语法。

    1) JSON 语法规则

    • 数据在名称/值对
    • 数据由逗号分隔
    • 花括号保存对象(无序容器)
    • 方括号保存数组(有序容器)

    2) JSON 名称/值对

          名称/值对相当是IOS中的词典,即是映射表,但是JSON中的"名称"必须是由字符串表示。 名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是

    "firstName" : "John"

    3) JSON 值

    JSON 值可以是:

    • 数字(整数或浮点数)
    • 字符串(在双引号中)
    • 逻辑值(true 或 false)
    • 数组(在方括号中)
    • 对象(在花括号中)
    • null

    图 1

    4) JSON 对象

        JSON 对象花括号中书写,对象可以包含多个"名称/值"对,即对象是一个无序的"名称/值"对集合

    图 2

    firstName":"John" , "lastName":"Doe" }

    5) JSON 数组

        JSON 数组方括号中书写,数组可包含多个对象,即数组有序集合

    图 3

    {
    "employees": [
    "firstName":"John" , "lastName":"Doe" }, 
    "firstName":"Anna" , "lastName":"Smith" }, 
    "firstName":"Peter" , "lastName":"Jones" }
    ]
    }

          在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。

    2 JSON数据解码

    2.1 IOS解码技术

    目前有如下的几种解码技术,性能是从低到高排序,

    • JBjson:比较老的第三方框架;
    • TouchJSON:也是老的第三方框架;
    • YAJL:也是比较老,但性能较高;
    • JSONKit:比较优秀的JSON框架,解码速度快
    • NSJSONSerialization它是IOS5之后Apple提供的官方API,是目前最优秀的JSON编码/解码框架。

    2.2 NSJSONSerialization

          在IOS中对JSON文件的解码和编码是通过NSJSONSerialization类实现的,该类的使用方式非常方便和简单。NSJSONSerialization类的设计思想是通过一个"中介对象"与JSON文件进行互相转换

    2.2.1 以NSData为中介

          由于NSData对象能够直接与文件进行交互,所以就能够以NSData对象为中间转换介质,如下图所示的转换过程。

    注意:

           这里的JSON对象可以是数组、词典等类型,具体看最外层"{}"内的类型。

    如下所示的"Notes.json" JSON文件,


    "ResultCode":110
    "Record":112 
    }

    如下的程序是对JSON文件进行解析为字典,然后验证是否正确;接着重新将字典编码为JSON文件。

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     // Do any additional setup after loading the view, typically from a nib.
     4     
     5     NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
     6     
     7     NSData *jsonData = [[NSData alloc] initWithContentsOfFile:path];
     8     id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
     9     
    10     NSInteger id = [jsonObj objectForKey:@"ResultCode"];
    11     NSLog(@"%@",[jsonObj objectForKey:@"ResultCode"]);
    12     
    13     NSData *data = [NSJSONSerialization dataWithJSONObject:jsonObj options:nil error:nil];
    14     [data writeToFile:@"/Users/tengfei/Desktop/s.json" atomically:true];   
    15 }

    2.2.2 以Stream为中介

          与NSData转换中介不同,通过Stream转换它是通过两种不同的对象进行。当进行JSON文件解析时,是通过NSInputStream;而当进行编码时,是通过NSOutputStream进行

    如下表是两种Stream的创建方法:

    类名

    创建Stream方法

    NSInputStream

    + (instancetype)inputStreamWithData:(NSData *)data

    + (instancetype)inputStreamWithFileAtPath:(NSString *)path

    + (instancetype)inputStreamWithURL:(NSURL *)url

    - (instancetype)initWithData:(NSData *)data

    - (instancetype)initWithFileAtPath:(NSString *)path

    - (instancetype)initWithURL:(NSURL *)url

    NSOutputStream

    + (instancetype)outputStreamToMemory

    + (instancetype)outputStreamToFileAtPath:(NSString *)path append:(BOOL)shouldAppend

    + (instancetype)outputStreamWithURL:(NSURL *)url append:(BOOL)shouldAppend

    - (instancetype)initToMemory

    - (instancetype)initToFileAtPath:(NSString *)path append:(BOOL)shouldAppend

    - (instancetype)initWithURL:(NSURL *)url append:(BOOL)shouldAppend

    如下是通过Stream进行JSON文件的编码和解码的简单示例:

     1 -(void) testJsonWithStream
     2 {
     3     NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; //获取文件的NSString路径
     4     
     5     NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:path]; //创建Stream对象
     6     [inputStream open]; //打开Stream对象
     7     
     8     id jsonObj = [NSJSONSerialization JSONObjectWithStream:inputStream options:NSJSONReadingMutableLeaves error:nil];
     9     
    10     NSInteger id = [jsonObj objectForKey:@"ResultCode"];
    11     NSLog(@"%@",[jsonObj objectForKey:@"ResultCode"]);
    12     
    13     //创建输出流
    14     NSOutputStream *outpuStream = [[NSOutputStream alloc] initToFileAtPath:@"/Users/tengfei/Desktop/s.json" append:true];
    15     [outpuStream open];   //打开Stream对象
    16     [NSJSONSerialization writeJSONObject:jsonObj toStream:outpuStream options:0 error:nil];
    17 }
  • 相关阅读:
    解决MAMP启动mysql服务 但是Navicat连接不上
    iOS 更改状态栏颜色和隐藏状态栏
    Xcode 常用代码段
    iOS开发小技巧
    怎么让self.view的Y从navigationBar下面开始计算
    iOS强制横屏或强制竖屏
    判断当前viewcontroller是push还是present的方式显示的
    Git命令速查表
    全栈程序员的新玩具Rust(一) IDE环境
    火狐的野望
  • 原文地址:https://www.cnblogs.com/huliangwen/p/5496846.html
Copyright © 2020-2023  润新知