==============
day11 JSON
==============
什么是json?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。采用完全独立于语言的文本格式,易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。
中文名JavaScript 对象表示法
JSON 语法是 JavaScript 对象表示语法的子集。
数据在健值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
JSON 数据的书写格式是:名称/值对
名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:
"firstName":"John"
JSON 值
JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号中)
对象(在花括号中)
null
对象表示为“{}”括起来的内容 -> OC字典
数组表示“[]”括起来的内容
按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对":
当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了:
{"firstName”:”威振”,”lastName”:”刘”,”email”:”
[email protected]”}
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性
表示数组
{
"people":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
]
}

{
"学生": [
{"姓名":"小明","年龄":23},
{"姓名":"大憨","年龄":24}
]
}

————————————————————————————————————————————————————————————
json解析示例
OC里面json数据转成对象,对应的是字典和数组,也可以把字典对象和数组对象转换成json数据,比如在下面的例子里,把字典转成json数据,然后保存到本地,我们再把这个json数据读取出来:
通过一个的示例把json数据存到文件中并读取它:
#define PATH @"/Users/liuweizhen/Desktop/test.txt"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSDictionary *dict = @{
@"name" : @"liuzhen",
@"age" : @23,
@"score" : @150,
@"hometown" : @"zheng_zhou",
};
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
if (error) {
NSLog(@"error: %@", error);
}
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:PATH contents:data attributes:nil];
data = [NSData dataWithContentsOfFile:PATH];
id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error) {
NSLog(@"%@", error);
}
NSLog(@"%@", obj);
}
return 0;
}
[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]
这句代码负责把JSONObject转成data, 这里object也可以直接用json格式的字符串,比如:
NSString *str = @"{\"name\" : \"liuzhen\", \"age\" : 123}";
NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
————————————————————————————————————————————————————————————
解析本地json文件取出指定的内容
yilin.json

————————————————————————————————————————————————————————————
数据模型 Model
/Users/liuweizhen/Desktop/day11_json/Json文件/yilin3.json
setValuesForKeysWithDictionary: 这个知识点以后再详细讲
————————————————————————————————————————————————————————————
json在线格式化
www.bejson.com
火狐浏览器(FireFox)插件: JSON-Handle
————————————————————————————————————————————————————————————
网络JSON文件
http://liuweizhen.local/1512/Doc/Books.json
http://10.0.8.8/sns/my/user_list.php?format=json&page=1&number=10
————————————————————————————————————————————————————————————
城市.json
输入省份,得到该省份下所有的城市
#import <Foundation/Foundation.h>
#define PATH @"/Users/liuweizhen/Desktop/day11_json/Json文件/城市.json"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSData *data = [NSData dataWithContentsOfFile:PATH];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray *cityArr = dictionary[@"城市代码"]; // 这个数组中存放着32个字典
NSMutableArray *provinceArr = [NSMutableArray array];
for (NSMutableDictionary *dict in cityArr) {
NSString *provinceName = dict[@"省"];
[provinceArr addObject:provinceName];
}
for (int i = 0; i < provinceArr.count; i++) {
NSLog(@"%@", provinceArr[i]);
}
while (1) {
// 操作:输入省份名字,得到该省的所有市
NSLog(@"请输入省份名");
char buff[20] = {};
scanf("%s", buff);
NSString *input = [NSString stringWithUTF8String:buff];
NSLog(@"input: %@", input);
NSDictionary *targetDict = nil;
for (int i = 0; i < provinceArr.count; i++) {
if ([provinceArr[i] isEqualToString:input]) {
targetDict = cityArr[i];
NSLog(@"%@", targetDict);
break;
}
}
NSLog(@"%@ %@", targetDict, [targetDict class]);
NSArray *findedCityArray = targetDict[@"市"];
for (NSDictionary *dict in findedCityArray) {
NSLog(@"=== %@ ===", dict[@"市名"]);
}
}
}
return 0;
}
思考:用面向对象的方法对处理
输入省份
打印些省份下面所有的城市名
China {
@property ... NSArray *城市代码; // 数组中存的是一个个省份对象
}
Province {
@property ... NSString *省;
@property ... NSArray *市; // 数组中存放的是一个个市对象
}
City {
@property ... NSString *市名;
@property ... NSString *编码;
}
————————————————————————————————————————————————————————————