数据处理1:json解析

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

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

数据处理1:json解析_第1张图片
屏幕快照 2016-02-04 下午8.58.18.png
数据处理1:json解析_第2张图片
屏幕快照 2016-02-04 下午8.58.44.png

最终效果如下:

数据处理1:json解析_第3张图片
屏幕快照 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 

@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解析)