一、什么是Json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
1、Json的语法规则
(1)数据在键值对中
(2)数据由逗号分隔
(3)花括号保存对象
(4)方括号保存数组
Json和OC的转换: 大括号 { } ——NSDictionary
中括号 [ ] ——NSArray
双引号 ” “ ——NSString
数字8、8.1 ——NSNumber
2、JSON 数据的书写格式是:名称/值对
如:"Name":"John"
二、Json解析
在iOS中Json的常见解析方法有四种:
1、JSONKit
2、SBJson
3、TouchJSON
4、NSJSONSerialization
前三种是第三方框架(在使用第三方类库过程中,如果项目是支持ARC的话,而这些类库文件不支持ARC特性的话,就会遇到ARC问题保错,所以就要添加arc特性,即
添加-fno-objc-arc);
第四种是苹果原生方法(ios5之后),性能最好。
使用JSONKit、SBJson和TouchJSON需要下载他们的库;
TouchJson包下载: http://download.csdn.net/detail/enuola/4523169;
SBJson包下载: http://download.csdn.net/detail/enuola/4523177;
JSONKit包下载: http://download.csdn.net/detail/enuola/4523160;
本文主要介绍NSJSONSerialization的使用:
苹果官方文档是这样写的:
An object that may be converted to JSON must have the following properties://转换成JSON的对象必须具有如下属性
The top level object is an NSArray or NSDictionary.//顶层对象必须是NSArray或者NSDictionary
All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.//所有的对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull
All dictionary keys are instances of NSString.//所有NSDictionary的key必须是NSString类型
Numbers are not NaN or infinity.//数字对象不能是非数值或无穷
下面就看个NSJSONSerialization解析实例:
{
"Name" : "奥巴马" ,
"ByName" : ["小奥","小巴","小马"],
"Education" : {
"GradeSchool" : "华盛顿第一小学",
"MiddleSchool" : ["华盛顿第一初中" , "华盛顿第一高中"],
"University" : {
"Name" : "哈佛大学",
"Specialty" : ["软件工程","会计"]
}
}
}
首先我们先来分析一下这段文字;
{}之前说过表示NSDictionary;NSDictionary中包含三个key("Name"/"ByName"/"Education")分别对应其Value;Value下又包括NSString、NSArray。
下面看demo:
// // ViewController.m // NSJSONSerialization // // Created by Oran Wu on 16-1-5. // Copyright (c) 2016年 MO. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self sample]; } - (void)sample{ NSError *error; //获取json文件路径,根据路径来获取里面的数据 NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"]; NSString *contents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (!error) { //将请求的数据放到NSData对象中 NSData *data = [contents dataUsingEncoding:NSUTF8StringEncoding]; //解析服务端返回的json格式数据 id jsonObjet = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; // typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) { // //将解析的数组和字典设置为可变对象 // NSJSONReadingMutableContainers = (1UL << 0), // //将解析数据的子节点创建为可变字符串对象 // NSJSONReadingMutableLeaves = (1UL << 1), // //允许解析对象的最上层不是字典或者数组 // NSJSONReadingAllowFragments = (1UL << 2) // } NSLog(@"jsonObjet:%@",jsonObjet); //根据得到的键值对通过key来得到对应的值,也就是值里面的数组 NSArray *byName = [jsonObjet objectForKey:@"ByName"]; for (int i = 0; i < byName.count; i++){ //获取数组中的键值对 NSString *name = [byName objectAtIndex:i]; NSLog(@"name:%@",name); } NSDictionary *education = [jsonObjet objectForKey:@"Education"]; NSLog(@"Education:%@",education); NSString *gradeSchool = [education objectForKey:@"GradeSchool"]; NSLog(@"GradeSchool:%@",gradeSchool); NSArray *middleSchool = [education objectForKey:@"MiddleSchool"]; for (int i = 0; i < middleSchool.count; i++) { NSString *middle = [middleSchool objectAtIndex:i]; NSLog(@"MiddleSchool:%@",middle); } NSDictionary *university = [education objectForKey:@"University"]; NSLog(@"University:%@",university); NSString *name = [university objectForKey:@"Name"]; NSLog(@"Name:%@",name); NSArray *specialty = [university objectForKey:@"Specialty"]; for (int i = 0; i < specialty.count; i++) { NSString *spec = [specialty objectAtIndex:i]; NSLog(@"Specialty:%@",spec); } NSString *Name = [jsonObjet objectForKey:@"Name"]; NSLog(@"Name:%@",Name); } }