objective-c - 基础篇 - 数据库网络 -- 使用JSON-生成json&解析json
2016-05-28 16:24
661 查看
(具体可以我自己的60天-数据库网络--Json解析之生成项目。)
注意点:
1:解析数据有两种:XML和JSON。JSON在ios相对而言使用较多。因为json更为简洁,数据量较小
2:JSON分为:生成JSON和解析JSON
3:如果不想php页面显示DEPRECATED或者NOTICE,可以在头部加入下面两行代码,因为如果PHP界面有DEPRECATED的话,那么在解析的时候,解析是不成功的。
error_reporting(E_ALL ^ E_DEPRECATED);
//error_reporting(E_ALL^ E_NOTICE);
4:解析JSON指的当请求返回的内容是数组或者字典,这时候我们就把返回内容变成JSON形式。
5:当我们使用对象类的形式来解析JSON时,需要注意的一点就是 对象类中的属性名称需要和请求返回的内容对应好。例如访问select.php表后返回的是一个user表中的(id, name, pass), 那么我们的user类就要有这三个对应的属性(id, name, pass)存在。
一、生成JSON
(1):只能把一个对象或者一个对象的数组(数组中是字典)或者一个字典转换成JSON,因为一个字典中对应的就是对象的属性,而且对象的行为是不可以放到JSON中的。
(2):使用NSJSONSerialization来生成JSON对象,并且其中的options:NSJSONWritingPrettyPrinted,这里用的是
writing。而解析JSON 用的是reading
(3):代码:
- (IBAction)createJSONAction:(UIButton *)sender {
NSDictionary * dic1 = [NSDictionary
dictionaryWithObjectsAndKeys:@"张三",@"name",@"男",@"sex",
@"22", @"age",
nil];
NSDictionary * dic2 = [NSDictionary
dictionaryWithObjectsAndKeys:@"李斯",@"name",@"女",@"sex",
@"33", @"age",
nil];
NSArray * arr = [NSArray
arrayWithObjects:dic1, dic2,
nil];
NSLog(@"%@", arr);
//转换为JSON----生成JSON,只能把一个对象或者一个对象的数组(数组中是字典)或者一个字典,因为一个字典中对应的就是对象的属性,而对象的行为是不可以放到JSON中的。
NSData * data = [NSJSONSerialization
dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted
error:nil];
//options:指的是读json还是写json
NSString * string = [[NSString
alloc]initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
}
二、解析JSON-字典形式
(1):字典是{{}}的形式
(2):使用NSJSONSerialization来生成JSON对象,并且其中的OPTIONS:NSJSONReadingAllowFragments
,这里用的是
reading.
(3):代码:
- (IBAction)analyzeAction:(UIButton *)sender {
NSURL * url = [NSURL
URLWithString:@"http://www.weather.com.cn/data/cityinfo/101010100.html"];
//创建一个有缓存机制的请求,这里用动态的 NSMutableURLRequest
NSMutableURLRequest * req = [[NSMutableURLRequest
alloc]initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20];
if (req ==
nil) {
NSLog(@"请求连接失败");
}
else{
//创建会话,使用sharesession
因为是一个单例的对象,所以是任何时间得到的会话对象都是同一个。
NSURLSession * session = [NSURLSession
sharedSession];
//创建任务
NSURLSessionDataTask * task = [session
dataTaskWithRequest:req completionHandler:^(NSData *
_Nullable data, NSURLResponse *
_Nullable response, NSError *
_Nullable error) {
//获得请求返回的内容
NSString * str = [[NSString
alloc]initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
//解析成JSON,这里的option用的是
reading的。
NSDictionary * dic = [NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingAllowFragments
error:nil];
NSDictionary * weatherinfo = [dic
objectForKey:@"weatherinfo"];
//通过key =weatherinfo,
来获得第二层的字典。
NSArray * arr = [weatherinfo
allKeys];
for (NSString * str
in arr) {
NSLog(@"%@ = %@", str, [weatherinfo
objectForKey:str]);
}
}];
//启动任务
[task
resume];
}
三、解析JSON-数组形式 -- 以下代码有两种解析数组的方式
代码:
//解析数组的内容形式-字典是{{}}的形式,
数组是 【{}】的形式。
通过这个的判断就可以使我们在解析成JSON时,确定是使用NSDictionary还是NSArray
- (IBAction)anlyzeArrayPHPAction:(UIButton *)sender {
NSURL * url = [NSURL
URLWithString:@"http://localhost/php/select.php"];
//创建一个有缓存机制的请求,这里用动态的 NSMutableURLRequest
NSMutableURLRequest * req = [[NSMutableURLRequest
alloc]initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20];
if (req ==
nil) {
NSLog(@"请求连接失败");
}
else{
//创建会话,使用sharesession
因为是一个单例的对象,所以是任何时间得到的会话对象都是同一个。
NSURLSession * session = [NSURLSession
sharedSession];
//创建任务
NSURLSessionDataTask * task = [session
dataTaskWithRequest:req completionHandler:^(NSData *
_Nullable data, NSURLResponse *
_Nullable response, NSError *
_Nullable error) {
NSLog(@"sencondthread");
/*以下的代码是不使用 YZBUser的,直接输出的。
//获得请求返回的内容
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//解析成JSON,这里的option用的是 reading的。
NSArray * array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
for (NSDictionary * dic in array) { //遍历请求返回的数组,得到其中的一个字典
NSArray * arr = [dic allKeys]; //获得一个字典中的key
for (NSString * str in arr) { //通过一个字典中的key获得对应的values
NSLog(@"%@ = %@", str, [dic objectForKey:str]);
}
}
*/
/*以下的代码是使用 YZBUser的。*/
//获得请求返回的内容
NSString * str = [[NSString
alloc]initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
//解析成JSON,这里的option用的是
reading的。
NSArray * array = [NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingMutableLeaves
error:nil];
//创建一个数组来存储所有的 user
NSMutableArray * users = [[NSMutableArray
alloc]init];
for (NSDictionary * dic
in array) { //遍历请求返回的数组,得到其中的一个字典
NSArray * arr = [dic
allKeys]; //获得一个字典中的key
YZBUser * user = [[YZBUser
alloc]init];
//创建一个user
for (NSString * str
in arr) { //通过一个字典中的key获得对应的values
[user
setValue:[dic objectForKey:str]
forKey:str];
NSLog(@"%d", user.idd);
}
[users
addObject:user]; //把一个个的user添加到users中
}
NSLog(@"%@", users);
}];
//启动任务
[task
resume];
}
注意点:
1:解析数据有两种:XML和JSON。JSON在ios相对而言使用较多。因为json更为简洁,数据量较小
2:JSON分为:生成JSON和解析JSON
3:如果不想php页面显示DEPRECATED或者NOTICE,可以在头部加入下面两行代码,因为如果PHP界面有DEPRECATED的话,那么在解析的时候,解析是不成功的。
error_reporting(E_ALL ^ E_DEPRECATED);
//error_reporting(E_ALL^ E_NOTICE);
4:解析JSON指的当请求返回的内容是数组或者字典,这时候我们就把返回内容变成JSON形式。
5:当我们使用对象类的形式来解析JSON时,需要注意的一点就是 对象类中的属性名称需要和请求返回的内容对应好。例如访问select.php表后返回的是一个user表中的(id, name, pass), 那么我们的user类就要有这三个对应的属性(id, name, pass)存在。
一、生成JSON
(1):只能把一个对象或者一个对象的数组(数组中是字典)或者一个字典转换成JSON,因为一个字典中对应的就是对象的属性,而且对象的行为是不可以放到JSON中的。
(2):使用NSJSONSerialization来生成JSON对象,并且其中的options:NSJSONWritingPrettyPrinted,这里用的是
writing。而解析JSON 用的是reading
(3):代码:
- (IBAction)createJSONAction:(UIButton *)sender {
NSDictionary * dic1 = [NSDictionary
dictionaryWithObjectsAndKeys:@"张三",@"name",@"男",@"sex",
@"22", @"age",
nil];
NSDictionary * dic2 = [NSDictionary
dictionaryWithObjectsAndKeys:@"李斯",@"name",@"女",@"sex",
@"33", @"age",
nil];
NSArray * arr = [NSArray
arrayWithObjects:dic1, dic2,
nil];
NSLog(@"%@", arr);
//转换为JSON----生成JSON,只能把一个对象或者一个对象的数组(数组中是字典)或者一个字典,因为一个字典中对应的就是对象的属性,而对象的行为是不可以放到JSON中的。
NSData * data = [NSJSONSerialization
dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted
error:nil];
//options:指的是读json还是写json
NSString * string = [[NSString
alloc]initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
}
二、解析JSON-字典形式
(1):字典是{{}}的形式
(2):使用NSJSONSerialization来生成JSON对象,并且其中的OPTIONS:NSJSONReadingAllowFragments
,这里用的是
reading.
(3):代码:
- (IBAction)analyzeAction:(UIButton *)sender {
NSURL * url = [NSURL
URLWithString:@"http://www.weather.com.cn/data/cityinfo/101010100.html"];
//创建一个有缓存机制的请求,这里用动态的 NSMutableURLRequest
NSMutableURLRequest * req = [[NSMutableURLRequest
alloc]initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20];
if (req ==
nil) {
NSLog(@"请求连接失败");
}
else{
//创建会话,使用sharesession
因为是一个单例的对象,所以是任何时间得到的会话对象都是同一个。
NSURLSession * session = [NSURLSession
sharedSession];
//创建任务
NSURLSessionDataTask * task = [session
dataTaskWithRequest:req completionHandler:^(NSData *
_Nullable data, NSURLResponse *
_Nullable response, NSError *
_Nullable error) {
//获得请求返回的内容
NSString * str = [[NSString
alloc]initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
//解析成JSON,这里的option用的是
reading的。
NSDictionary * dic = [NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingAllowFragments
error:nil];
NSDictionary * weatherinfo = [dic
objectForKey:@"weatherinfo"];
//通过key =weatherinfo,
来获得第二层的字典。
NSArray * arr = [weatherinfo
allKeys];
for (NSString * str
in arr) {
NSLog(@"%@ = %@", str, [weatherinfo
objectForKey:str]);
}
}];
//启动任务
[task
resume];
}
三、解析JSON-数组形式 -- 以下代码有两种解析数组的方式
代码:
//解析数组的内容形式-字典是{{}}的形式,
数组是 【{}】的形式。
通过这个的判断就可以使我们在解析成JSON时,确定是使用NSDictionary还是NSArray
- (IBAction)anlyzeArrayPHPAction:(UIButton *)sender {
NSURL * url = [NSURL
URLWithString:@"http://localhost/php/select.php"];
//创建一个有缓存机制的请求,这里用动态的 NSMutableURLRequest
NSMutableURLRequest * req = [[NSMutableURLRequest
alloc]initWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20];
if (req ==
nil) {
NSLog(@"请求连接失败");
}
else{
//创建会话,使用sharesession
因为是一个单例的对象,所以是任何时间得到的会话对象都是同一个。
NSURLSession * session = [NSURLSession
sharedSession];
//创建任务
NSURLSessionDataTask * task = [session
dataTaskWithRequest:req completionHandler:^(NSData *
_Nullable data, NSURLResponse *
_Nullable response, NSError *
_Nullable error) {
NSLog(@"sencondthread");
/*以下的代码是不使用 YZBUser的,直接输出的。
//获得请求返回的内容
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//解析成JSON,这里的option用的是 reading的。
NSArray * array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
for (NSDictionary * dic in array) { //遍历请求返回的数组,得到其中的一个字典
NSArray * arr = [dic allKeys]; //获得一个字典中的key
for (NSString * str in arr) { //通过一个字典中的key获得对应的values
NSLog(@"%@ = %@", str, [dic objectForKey:str]);
}
}
*/
/*以下的代码是使用 YZBUser的。*/
//获得请求返回的内容
NSString * str = [[NSString
alloc]initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
//解析成JSON,这里的option用的是
reading的。
NSArray * array = [NSJSONSerialization
JSONObjectWithData:data options:NSJSONReadingMutableLeaves
error:nil];
//创建一个数组来存储所有的 user
NSMutableArray * users = [[NSMutableArray
alloc]init];
for (NSDictionary * dic
in array) { //遍历请求返回的数组,得到其中的一个字典
NSArray * arr = [dic
allKeys]; //获得一个字典中的key
YZBUser * user = [[YZBUser
alloc]init];
//创建一个user
for (NSString * str
in arr) { //通过一个字典中的key获得对应的values
[user
setValue:[dic objectForKey:str]
forKey:str];
NSLog(@"%d", user.idd);
}
[users
addObject:user]; //把一个个的user添加到users中
}
NSLog(@"%@", users);
}];
//启动任务
[task
resume];
}
相关文章推荐
- android 网络通信学习
- VMware网络配置详解一:三种网络模式简介
- 常用网络命令——ping
- HTTP 十分钟教程
- 应用程序中的服务器错误。HTTP 错误 404 - Not Found。
- Android okHttp网络请求之缓存控制Cache-Control(四)
- navicat使用http隧道访问mysql
- CentOS 网络配置
- rhel 6下配置网络yum源(虚拟机环境下)
- Socket编程(4)TCP粘包问题及解决方案
- nginx使用ssl模块配置HTTPS支持
- 详解WMware Workstation的三种网络配置方式
- Okhttp----缓存的加入方式----附完整demo
- PhoneGap android开发:网络&设备信息
- 孤岛营救问题[(网络流24题之14)][状态压缩+最短路径]
- I/O多路转接之select——基于TCP协议
- PHP中$_SERVER[HTTP_REFERER]
- 用文言文翻译网络流行语!~张润萌
- 「理解HTTP」之常见的状态码
- 网络模块的封装