什么是JSON?
JSON : JavaScript Object Notation (JavaScript的对象标记符)
JSON采用完全独立于语言的文本格式
在实际开发中经常使用JSON来获取服务器上的数据,并通过解析json数据获取我们想要的数据。
对于JSON格式的数据来说都是以键值对的形式存在的。
键(key)是用来描述值(value)的意义的,可以通过任意的键找到相应的值。
键值对.png
以JSON格式来写出键和值
"name"是键 "李四"是值,键与值之间用 " : " 隔开,两个键值对之间用 " , " 隔开,两头以大括号开头以大括号结尾。
除此之外还能进行key-value的嵌套。如,key "user"所对应的value是一个整体,在这个value中还有相对应的key-value。
JSON本质.png
从本质上讲JSON格式的数据就是字符串,JSON格式的数据解析就是对字符串的语义分析。
JSON语义分析.png
以一段天气信息为例,将其转换为JSON格式的数据。天气信息作为一个key,内容作为value,而内容中又有相对应的键值对。
JSON实例.png
iOS中的JSON
iOS 5开始苹果公司开始提供自己的JSON库 原生JSON解析库:iOS 5+
第三方JSON库:TouchJson SBJson JSONKit
iOS原生JSON库只支持iOS 5及以上的版本,诺要支持iOS 5以下的版本则需要引入第三方库。因为现在已经是iOS 11了,所以我们用自带的JSON库来学习一下。
实例
iOS 5+ 自带JSON操作库
数据解析:
要求:分别解析以下json库
1.{"name":"James","age":"30"}
2.{"user":{"name":"Kobe","age":"30"}}
3.[{"name":"Curry"},{"name":"Thompson"}]
4.{"user":[{"name":"Pual"},{"name":"Harden"}]}
目的:掌握通过NSJSONSerialization类解析JSON数据
重点:掌握静态函数JSONObjectWithData:option:error:的使用
先在storyboard放一个TextView用来显示解析出来的数据,再放一个button
image.png
- (IBAction)button:(id)sender {
NSString *jsonstr = @"{\"name\":\"James\",\"age\":\"30\"}";//这里需要给双引号添加转义字符否则会报错
NSData * jsonDate = [jsonstr dataUsingEncoding:NSUTF8StringEncoding];//把jsonstr转换成NSData格式的数据
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonDate options:NSJSONReadingAllowFragments error:nil];
if ([jsonObj isKindOfClass:[NSDictionary class]]) {//字典类型数据会走到这里
NSDictionary *dic = (NSDictionary *)jsonObj; //转成字典的对象
//通过键获取值显示在textview中 stringByAppendingString将字符串接到原有的字符串后面
_TextView.text = [_TextView.text stringByAppendingString:@"\n"];//这是一个回车
_TextView.text = [_TextView.text stringByAppendingString:[dic objectForKey:@"name"]];
_TextView.text = [_TextView.text stringByAppendingString:@"\n"];
_TextView.text = [_TextView.text stringByAppendingString:[dic objectForKey:@"age"]];
}
if ([jsonObj isKindOfClass:[NSArray class]]) {//数组类型的数据会走到这里
}
}
image.png
2.{"user":{"name":"Kobe","age":"30"}} 有两层所以要解析两次
NSString *jsonTreeStr = @"{\"user\":{\"name\":\"Kobe\",\"age\":\"25\"}}";
NSData * jsonDate = [jsonTreeStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic1 = [dic objectForKey:@"user"];//加一次解析
_TextView.text = [_TextView.text stringByAppendingString:[dic1 objectForKey:@"name"]];//dic改成dic1
3.[{"name":"Curry"},{"name":"Thompson"}] 数组形式的
NSString *jsonArrStr = @"[{\"name\":\"Curry\"},{\"name\":\"Thompson\"}]";
NSData * jsonDate = [jsonArrStr dataUsingEncoding:NSUTF8StringEncoding];
if ([jsonObj isKindOfClass:[NSArray class]]) {
//数组类型
//数据转换:转换成数组
NSArray *arr = (NSArray *)jsonObj;
//访问数组中的数据
for (NSDictionary *dic in arr) {
_TextView.text = [_TextView.text stringByAppendingString:@"\n"];
_TextView.text = [_TextView.text stringByAppendingString:[dic objectForKey:@"name"]];
_TextView.text = [_TextView.text stringByAppendingString:@"\n"];
}
}
4.{"user":[{"name":"Pual"},{"name":"Harden"}]} 此时会走到字典类型中,用user获取值,这个值是个数组所以要用for循环取值
NSString *jsonTreeArrStr = @"{\"user\":[{\"name\":\"Pual\"},{\"name\":\"Harden\"}]}";
NSData * jsonDate = [jsonTreeArrStr dataUsingEncoding:NSUTF8StringEncoding];
if ([jsonObj isKindOfClass:[NSDictionary class]]) {
//字典类型
//转成字典的对象
NSDictionary *dic = (NSDictionary *)jsonObj;
//jsonTreeArrStr第一层是字典类型 要先那拿到第一层的key 里面的数组用for循环取值
NSArray *arr = [dic objectForKey:@"user"];
for (NSDictionary *dic in arr) {
_TextView.text = [_TextView.text stringByAppendingString:@"\n"];
_TextView.text = [_TextView.text stringByAppendingString:[dic objectForKey:@"name"]];
_TextView.text = [_TextView.text stringByAppendingString:@"\n"];
}
}
JSON读取文件
数据解析:
要求:1.从文件读取json数据并解析,文件名称weatherinfo.json
2.从网络读取json数据并解析
目的:掌握通过NSJSONSerialization类解析来自文件和网络的json数据
重点:掌握静态函数JSONObjectWIthinkData:options:error:的使用
灵活掌握json数据源的读取技巧
在项目中加入一个json格式的文件
image.png
还是跟上面的案例一样 先在storyboard放一个TextView用来显示解析出来的数据,再放一个button。
代码主体也是没有变化。
- (IBAction)button:(id)sender {
NSString *jsonStr = nil;
//文件路径
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"weatherinfo" ofType:@"json"];
//调用系统默认的文件路径
NSFileManager *fileMgr = [NSFileManager defaultManager];
//通过函数fileExistaAtPath判断路径下是否存在这个文件
if ([fileMgr fileExistsAtPath:filePath]) {
jsonStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
}
else
{
_textView.text = @"文件没有找到";
return;
}
NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
if ([jsonObj isKindOfClass:[NSDictionary class]]) {
//字典类型
NSDictionary *dic = (NSDictionary *)jsonObj;
NSDictionary *dic1 = [dic objectForKey:@"weatherinfo"];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"city"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"temp1"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"temp2"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"weather"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"ptime"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
}
if ([jsonObj isKindOfClass:[NSArray class]]) {
//数组类型
NSArray *arr = (NSArray *)jsonObj;
}
}
image.png
JSON网络解析
数据解析:
要求:1.从文件读取json数据并解析,文件名称weatherinfo.json
2.从网络读取json数据并解析http://www.weather.com.cn/data/cityinfo/101010100.html
目的:掌握通过NSJSONSerialization类解析来自文件和网络的JSON数据
重点:掌握静态函数JSONObjectWithData:option:error:的使用,灵活掌握json的数据源读取技巧
3种方法从网络上获取数据:
1.通过url从网络上获取数据
2.通过NSString自带的方法从网络上获取数据
3.用一个连接从网络上读取数据
- (IBAction)button:(id)sender {
//中国天气网提供的接口
//1.通过url从网络上获取数据
NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/data/cityinfo/101010100.html"];
// NSData *jsonData = [NSData dataWithContentsOfURL:url];
//2.通过NSString自带的方法从网络上获取数据
// NSString *jsonStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
// NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
//3.用一个连接从网络上读取数据
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
if ([jsonObj isKindOfClass:[NSDictionary class]]) {
//字典类型
NSDictionary *dic = (NSDictionary *)jsonObj;
NSDictionary *dic1 = [dic objectForKey:@"weatherinfo"];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"city"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"temp1"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"temp2"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"weather"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
_textView.text = [_textView.text stringByAppendingString:[dic1 objectForKey:@"ptime"]];
_textView.text = [_textView.text stringByAppendingString:@"\n"];
}
if ([jsonObj isKindOfClass:[NSArray class]]) {
//数组类型
NSArray *arr = (NSArray *)jsonObj;
}
}
image.png
网友评论