初识JSON解析(iOS)

作者: 新垣结衣的男朋友丶 | 来源:发表于2017-12-13 17:15 被阅读0次

什么是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

相关文章

网友评论

    本文标题:初识JSON解析(iOS)

    本文链接:https://www.haomeiwen.com/subject/hfwaixtx.html