您的位置:首页 > 理论基础 > 计算机网络

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];
        
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: