美文网首页
数据处理1:json解析

数据处理1:json解析

作者: 统领三界 | 来源:发表于2016-02-04 22:08 被阅读108次

    ![Uploading 屏幕快照 2016-02-04 下午8.58.18_815759.png . . .]
    代码的核心是处理数据,当我们拿到一对数据之后应该如何处理,其实在ios里面有很多的方法,本篇文章我们介绍其中最常用的一种方法是json解析.
    在ios编程里面常用的数据类型主要有NSString(字符串),NSArray(数组),NSDictionary(字典) 等,但是为了便于操作,我们一般会将最终数据转换成model类型(自建的类),下面我们详细介绍如何转换.

    首先在xcode里面新建一个工程,然后cmd+N 选择ios下面的other里面的Empty,添加一个空文件,

    屏幕快照 2016-02-04 下午8.58.18.png 屏幕快照 2016-02-04 下午8.58.44.png

    最终效果如下:

    屏幕快照 2016-02-04 下午9.03.26.png

    然后在这这个空白文档里面添加我们想要解析的数据

    [
    {"name":"lufei",  "age":"18", "gender":"male"},
    
    {"name":"namei",  "age":"19", "gender":"female"},
    
    {"name":"suolong","age":"20", "gender":"male"},
    
    {"name":"yihu",   "age":"18", "gender":"male"},
    
    {"name":"luobin", "age":"20", "gender":"female"}
    ]
    

    那么我们观察它的数据结构,最外层是一个数组,数组里面有5个字典元素,每一字典有三个键值对,分别是name,age,gender.这样我们就可以根据这三个key去创建一个student类来接受字典的数据.
    在Student.h文件里面我们添加需要的数据

    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject
    
    @property (nonatomic,strong)NSString *name;
    
    @property (nonatomic,strong)NSString *gender;
    
    @property (nonatomic,strong)NSString *age;
    
    @end
    

    在Student.m文件里面

    #import "Student.h"
    
    @implementation Student
    //如果创建的model的属性和解析的字典的key值不统一的话,就需要以下方法,防止程序崩溃
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    
    
    }
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"%@%@", _name,_gender];
    }
    @end
    

    准备工作做好之后我们就可以解析数据了.
    第一步:获取文件路径

        NSString *path = [[NSBundlemainBundle]
    pathForResource:@"json" ofType:@"txt"];
    

    第二步:将文件数据转换成data数据

        NSData *data = [NSData dataWithContentsOfFile:path];
    

    第三步:解析数据

    NSArray *array = [NSJSONSerialization JSONObjectWithData:data 
    options:NSJSONReadingAllowFragments error:nil];
    
    

    为了验证我们的代码有没有问题,我们可以先打印一下这个array看看里面有没有数据

        NSLog(@"%@",array);
    

    打印结果正常,我们就可以继续解析数据了

      self.dataArray = [NSMutableArray arrayWithCapacity:2];
        for (NSDictionary *dictionary in array) {
            Student *student = [Student new];
            [student setValuesForKeysWithDictionary:dictionary];
            [self.dataArray addObject:student];
        }
    

    这里需要注意一点,我们最终要把数据放到一个个model里面,然后把这些model放到一个数组里面,这个数组一定要提前初始化,开辟空间,否则数据是存不进去的.

    数据解析完毕我们可以打印一下这数据看看有没有成功

    NSLog(@"%@",self.dataArray);
    

    最后需要补充几点:
    1,大部分时候数据并没有这么简单,有可能会嵌套两层,三层甚至更多,
    那么这个时候我们也可能需要多层循环去解析数据.
    2,有的时候我们拿到的数据,并不是全部都需要,可能只需要某一个key
    对应的值,那么我们只需要解析我们需要的那一部分就可以了.
    3,有时候原始数据的key可能会和xcode的关键字冲突,那么这个时候属性名就不能和原始数据的key同名了,这个时候如果想要获取这个key对应的值,我们就需要重写父类方法,举一个例子,假设数据里面有"id"这个key,同时我们如果想要获取这个key对应的值,该怎么做呢?首先我们在命名属性的时候,不能用id这个名字,可以改成大写或者其他任意合法的名字
    .h文件

    @property (nonatomic,strong)NSString *ID;
    

    .m文件重写父类方法

    //如果创建的model的属性和解析的字典的key值不统一的话,就需要以下方法,防止程序崩溃
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
        if ([key isEqualToString:@"id"]) {
            _ID = value;
        }
    
    }
    

    相关文章

      网友评论

          本文标题:数据处理1:json解析

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