1. 什么是JSON?
1). JSON是一种轻量级的数据格式,一般用于数据交互.
2). 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
3). JSON的格式很像OC中的字典和数组
{ "name" : "jack" , "age" : 10 }
{ "names" : [ "jack" , "rose" , "jim" ] }
标准JSON格式的注意: key必须用双引号
2. 序列化 和 反序列化
序列化: OC对象 ---> JSON/XML
反序列化: JSON/XML ---> OC对象
转换对照表
JOSN OC
{} @{}
[] @[]
"" @""
false NSNumber 0
true NSNumber 1
null NSNull为空
JSON解析方案:
a.第三方框架 JSONKit\SBJSON\TouchJSON
b.苹果原生(NSJSONSerialization)性能最好
NSJSONSerialization 常见方法:
JSON数据 —> OC对象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
OC对象 —> JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
OC对象是否可转
+ (BOOL)isValidJSONObject:(id)obj;
注意: 以下代码 包括:
1. 序列化(OC对象 ---> JSON数据)
注意点: 并不是所有的OC对象都能转为JSON(NSString类型就不行)
序列化的要求:
-最外层必须是 NSArray or NSDictionary
-所有的元素必须是 NSString, NSNumber, NSArray, NSDictionary, or NSNull
- 字典中所有的key都必须是 NSString类型的
- NSNumbers不能死无穷大
如果不满足以上要求: 为了防止程序崩溃, 需要做一个oc对象是否能转为JSON的判断.
// 判断oc对象是否能转
BOOL isValid = [NSJSONSerialization isValidJSONObject:dictM];
if (!isValid) {
NSLog(@"%zd",isValid);
return;
}
2. 反序列化(JSON数据 ---> OC对象)
注意点: 如果解析 非字典/数组的数据, 只能使用 NSJSONReadingAllowFragments这个枚举
kNilOptions == 0
3. JSON 和 OC对象的关系
4. plist数据 转为 JSON数据
//
// ViewController.m
// 05掌握-JSON解析
//
// Created by 朝阳 on 2017/12/7.
// Copyright © 2017年 sunny. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self OCToJson];
}
// 序列化(OC对象 --> JSON)
- (void)OCToJson
{
NSDictionary *dictM = @{
@"name" : @"ZY",
@"age" : @19
};
NSArray *arrayM = @[@"44",@"123"];
// 注意: 并不是所有的OC对象都能转为JSON(NSString类型就不行)
NSString *strM = @"guizhaoyang";
/*
- 最外层必须是 NSArray or NSDictionary
- 所有的元素必须是 NSString, NSNumber, NSArray, NSDictionary, or NSNull
- 字典中所有的key都必须是 NSString类型的
- NSNumbers不能死无穷大
*/
// 判断oc对象是否能转
BOOL isValid = [NSJSONSerialization isValidJSONObject:dictM];
if (!isValid) {
NSLog(@"%zd",isValid);
return;
}
/*
param1:要转换的OC对象
param2: 排版,美观 NSJSONWritingPrettyPrinted
param3:错误信息
*/
NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
// 反序列化(JSON --> OC对象)
- (void)JsonToObject
{
//1. 确定URL
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2. 创建请求对象
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
//3. 发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// data(响应体) ---> 本质就是字符串
//4. 解析数据
// 反序列化 JSON--->OC对象
/*
NSJSONReadingMutableContainers = (1UL << 0), 返回可变的字典和数组
NSJSONReadingMutableLeaves = (1UL << 1), iOS7以后有问题,一般不用
NSJSONReadingAllowFragments = (1UL << 2) 解析的数据 既不是字典也不是数组 必须使用这个枚举值
*/
// kNilOptions == 0
// NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
// NSLog(@"%@",dict[@"success"]);
// 如果解析非字典/数组的数据, 只能使用NSJSONReadingAllowFragments枚举
NSString *strM = @"\"GZY\"";
id obj = [NSJSONSerialization JSONObjectWithData:[strM dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@--%@",[obj class],obj);
}];
}
// JSON 和 OC对象的关系
- (void)JsonWithObject
{
//NSString *strM = @"{\"error\":\"用户名不存在\"}";
//NSString *strM = @"[\"error\",\"用户名不存在\"]";
//NSString *strM = @"\"wendingding\"";
//NSString *strM = @"false";
//NSString *strM = @"true";
NSString *strM = @"null";
id obj = [NSJSONSerialization JSONObjectWithData:[strM dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:0];
NSLog(@"%@---%@",[obj class],obj);
/*
JOSN OC
{} @{}
[] @[]
"" @""
false NSNumber 0
true NSNumber 1
null NSNull为空
*/
//nil
[NSNull null]; //该方法获得的是一个单粒,表示为空,可以用在字典或者是数组中
}
// plist转为JSON数据
- (void)plistToJson
{
NSArray *arrayM = [NSArray arrayWithContentsOfFile:@"/Users/sunny/Desktop/photo/apps.plist"];
//NSLog(@"%@",arrayM);
// 序列化
NSData *data = [NSJSONSerialization dataWithJSONObject:arrayM options:NSJSONWritingPrettyPrinted error:nil];
[data writeToFile:@"/Users/sunny/Desktop/apps.json" atomically:YES];
}
@end