JSON的解析

JSON是一种轻量级的数据格式,一般用于数据交互

服务器返回给客户端的数据,一般都是JSON格式或XML格式(文件下载除外)

JSON格式很像OC中的字典和数组

例如:{“name”:”jack”, “age”:10}

     {“names”:[“jack”,”rose”,”jim”]}

注意:标准JSON格式中key必须用双引号

     想要从JSON中挖掘出具体数据,必须对JSON进行解析,将JSON转换为OC数据类型

     在iOS中,JSON的常见解析方案有两种:第三方框架(JSONKit,SBJson,TouchJSON)

                                                                苹果自带(NSJSONSerialization)

//JSON和OC的对应关系
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    //NSString *strM = @"\{\"error\":\"用户名不存在\"}";
    //NSString *strM = @"[\"error\",\"用户名不存在\"]";
    //id obj = [NSJSONSerialization JSONObjectWithData:[strM dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
    NSString *strM = @"\"string\"";
    //不是数组或字典:NSJSONReadingAllowFragments
    //strM = “false” 输出:NSNumber 0
    //strM = “true” 输出:NSNumber 1
    //strM = “null” 输出:NSNull null
    //注意:[NSNull null]该方法获得的是一个单例,表示为空,可以用在字典或者是数组中
    id obj = [NSJSONSerialization JSONObjectWithData:[strM dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"%@----%@", [obj class], obj);
}
//JSON->OC
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    //1 确定url
    NSURL *url = [NSURL URLWithString:@"http://主机地址/路径?参数&参数"];
    //2 创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3 发送异步请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //4 解析数据
        //data本质上是一个json字符串
        //NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        //JSON->OC对象(反序列化)
        /*
            第一个参数:JSON的二进制数据
            第二个参数:
            NSJSONReadingMutableContainers = (1UL << 0), 可变字典和数组
            NSJSONReadingMutableLeaves = (1UL << 1), 内部所有的字符串都是可变的(iOS7之后有问题,一般不用)
            NSJSONReadingAllowFragments = (1UL << 2), 既不是字典也不是数组,则必须使用该枚举值
            第三个参数:错误信息
        */ 
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        NSLog(@"%@", dict[@"error"]);
    }];
}
//OC->JSON
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSDictionary *dictM = @{
        @"name":@"name1",
        @"age":@30
    };
    //注意:并不是所有的OC对象都能转换为JSON
    //1 最外层必须是NSArray或NSDictionary
    //2 所有的元素必须是 NSString,NSNumber, NSArray,NSDictionary,NSNull
    //3 字典中所有的key都必须是NSString类型的
    //4 所有的NSNumber必须是正确的且不能是无穷大
    //判断是否可以转换
    BOOL isValid = [NSJSONSerialization isValidJSONObject:dictM];
    if(!isValid) {
        NSLog(@"%zd", isValid);
        return;
    }
    /*
        第一个参数:要转换的OC对象
        第二个参数:选项NSJSONWritingPrettyPrinted 排版 美观
    */
    NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
    NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);   
}
         
//plist文件转json文件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSArray *arrayM = [NSArray arrayWithContentsOfFile:@"/Path/FileName.plist"];
    //OC->JSON
    NSData *data = [NSJSONSerialization dataWithJSONObject:arrayM options:NSJSONWritingPrettyPrinted error:nil];
    [data writeToFile:@"/Path/FileName.json" atomically:YES];
}


猜你喜欢

转载自blog.csdn.net/baidu_28787811/article/details/80361722
今日推荐