![Uploading 屏幕快照 2016-02-04 下午8.58.18_815759.png . . .]
代码的核心是处理数据,当我们拿到一对数据之后应该如何处理,其实在ios里面有很多的方法,本篇文章我们介绍其中最常用的一种方法是json解析.
在ios编程里面常用的数据类型主要有NSString(字符串),NSArray(数组),NSDictionary(字典) 等,但是为了便于操作,我们一般会将最终数据转换成model类型(自建的类),下面我们详细介绍如何转换.
首先在xcode里面新建一个工程,然后cmd+N 选择ios下面的other里面的Empty,添加一个空文件,
最终效果如下:
然后在这这个空白文档里面添加我们想要解析的数据
[
{"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;
}
}