OC学习第十一节Json

==============
day11 JSON
==============
什么是json?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。采用完全独立于语言的文本格式,易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。
中文名JavaScript 对象表示法
JSON 语法是 JavaScript 对象表示语法的子集。
数据在健值对中
数据由逗号分隔
花括号保存对象
方括号保存数组

JSON 数据的书写格式是:名称/值对
名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:
"firstName":"John"

JSON 值
JSON 值可以是:
        数字(整数或浮点数)
        字符串(在双引号中)
        逻辑值(true 或 false)
        数组(在方括号中)
        对象(在花括号中)
        null

对象表示为“{}”括起来的内容 -> OC字典
数组表示“[]”括起来的内容

按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对":
当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了:
{"firstName”:”威振”,”lastName”:”刘”,”email”:”liuxing8807@126.com”}

当需要表示一组值时,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 *编码;
}
————————————————————————————————————————————————————————————




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值