初识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