parse Json

一、数据来源

1.来源于mainBundle

2.来源于服务器

二、解析步骤

`1.数据来源于mainBundle

//读取数据

    NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"test.json" ofType:nil];
解析数据(获取key对应的value)接受原则,{}使用字典 []是用数组接受

  NSError *error = nil;
    NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
//如果有错误可以打印

If(error){

NSLog(_@”%@”,error.userInfo);

}

//体感温度
    NSNumber *feelsTemp = jsonDic[@"FeelsLikeC"];
    //预报天气的温度
    NSString *temp = jsonDic[@"temp_c"];
    //城市名字
    NSArray *requestArray = jsonDic[@"request"];
    NSDictionary *queryDic = requestArray[0];
    NSString *cityStr = queryDic[@"query"];
    //验证
    NSLog(@"feelsTemp:%@; temp:%@; cityStr:%@", feelsTemp, temp, cityStr);
特殊标注的是重点掌握

2.服务器解析 parseJson –server

因为要与服务器相应,所以就要发送网络请求

//发送请求  

 NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.raywenderlich.com/demos/weather_sample/weather.php?format=json"]];
//创建NSURLSession的实例4对象(感觉像是一种媒介)

脑补一下:NSURLSession

 

NSURLSession提供的功能:

1.通过URL将数据下载到内存

2.通过URL将数据下载到文件系统

3.将数据上传到指定URL

4.在后台完成上述功能

  NSURLSession *session = [NSURLSession sharedSession];

//创建任务    其中block中的线程是子线程

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode == 200) {
            //NSData --> JSON Object(NSDictionary/NSArray)
            NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            //解析jsonDic对应值
            [self parseJson:jsonDic];
        }
    }];
//开始任务

[task resume];

- (void)parseJson:(NSDictionary *)jsonDic {
    //解析(子线程)
    //湿度
    NSDictionary *dataDic = jsonDic[@"data"];
    NSArray *currentArray = dataDic[@"current_condition"];
    NSDictionary *currentDic = currentArray[0];
    NSString *humidityStr = currentDic[@"humidity"];
    //天气描述
    NSString *weatherDesc = dataDic[@"weather"][0][@"weatherDesc"][0][@"value"];
   
    //验证
    NSLog(@"humidity:%@; weatherDesc:%@", humidityStr, weatherDesc);
}
 

解析最重要的不是怎么得到数据,而是怎么建立数据模型,将庞大繁琐的解析工作剥离控制器,解析单独在一个类里完成。降低主控制器的工作种类,更加清晰的管理代码,下面是两个例子,一步步的将数据的解析独立起来

Demo-01

//  TRWeather.m
//  Demo02-JSONParse-Server
//  TRWeather.h
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface TRWeather : NSObject
//湿度
@property (nonatomic, strong) NSString *humidity;
//天气描述
@property (nonatomic, strong) NSString *weatherDesc;

//给定自定参数,返回id(类方法/实例方法)
+ (id)parseJsonByModel:(NSDictionary *)jsonDic;
 

//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import "TRWeather.h"

@implementation TRWeather

+ (id)parseJsonByModel:(NSDictionary *)jsonDic {
    return [[self alloc] initWithJson:jsonDic];
}

- (id)initWithJson:(NSDictionary *)jsonDic {
    //解析逻辑
    if (self = [super init]) {
        self.humidity = jsonDic[@"data"][@"current_condition"][0][@"humidity"];
        //天气描述
    }
    return self;
}
 

//  ViewController.m
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import "ViewController.h"
#import "TRWeather.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //发送请求
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.raywenderlich.com/demos/weather_sample/weather.php?format=json"]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode == 200) {
            //NSData --> JSON Object(NSDictionary/NSArray)
            NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            //解析jsonDic对应值
            [self parseJson:jsonDic];
        }
    }];
    [task resume];
    //接收服务器返回的数据
}

- (void)parseJson:(NSDictionary *)jsonDic {
    //解析(子线程)
    TRWeather *weather = [TRWeather parseJsonByModel:jsonDic];
    //验证
    NSLog(@"humidity:%@", weather.humidity);
}

Demo 2

//  TRDaily.h
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface TRDaily : NSObject
//最高温
@property (nonatomic, strong) NSString *tempMaxC;
//最低温
@property (nonatomic, strong) NSString *tempMinC;
//天气图标的url
@property (nonatomic, strong) NSString *iconURL;

//给定字典参数,返回id
+ (id)parseJsonByDic:(NSDictionary *)weatherDic;


 

//
//  TRDaily.m
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import "TRDaily.h"

@implementation TRDaily

+ (id)parseJsonByDic:(NSDictionary *)weatherDic {
    return [[self alloc] initWithJsonDic:weatherDic];
}

- (id)initWithJsonDic:(NSDictionary *)weatherDic {
    if (self = [super init]) {
        //最高温
        self.tempMaxC = weatherDic[@"tempMaxC"];
        //最低温
        self.tempMinC = weatherDic[@"tempMinC"];
        //图片url的value
        self.iconURL = weatherDic[@"weatherIconUrl"][0][@"value"];
    }
    return self;
}

@end
 

//  TRDataManager.h
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface TRDataManager : NSObject


//给定字典,返回已经解析好得TRDaily模型对象组成的数组
+ (NSArray *)parseWeatherArray:(NSDictionary *)jsonDic;


@end
 

//  TRDataManager.m
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import "TRDataManager.h"
#import "TRDaily.h"

@implementation TRDataManager

+ (NSArray *)parseWeatherArray:(NSDictionary *)jsonDic {
    NSArray *weatherArray = jsonDic[@"data"][@"weather"];
    //声明可变数组(存储已经转完的模型对象)
    NSMutableArray *mutableArray = [NSMutableArray array];
    for (NSDictionary *weatherDic in weatherArray) {
        //weatherDic -> TRDaily
        TRDaily *daily = [TRDaily parseJsonByDic:weatherDic];
        [mutableArray addObject:daily];
    }
   
    return [mutableArray copy];
}

@end
 

//
//  TRWeather.h
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface TRWeather : NSObject
//湿度
@property (nonatomic, strong) NSString *humidity;
//天气描述
@property (nonatomic, strong) NSString *weatherDesc;

//给定自定参数,返回id(类方法/实例方法)
+ (id)parseJsonByModel:(NSDictionary *)jsonDic;

@end
 

//
//  TRWeather.m
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import "TRWeather.h"

@implementation TRWeather

+ (id)parseJsonByModel:(NSDictionary *)jsonDic {
    return [[self alloc] initWithJson:jsonDic];
}

- (id)initWithJson:(NSDictionary *)jsonDic {
    //解析逻辑
    if (self = [super init]) {
        self.humidity = jsonDic[@"data"][@"current_condition"][0][@"humidity"];
        //天气描述
    }
    return self;
}

@end
 

//
//  ViewController.m
//  Demo02-JSONParse-Server
//
//  Created by tarena on 15/12/12.
//  Copyright © 2015年 tarena. All rights reserved.
//

#import "ViewController.h"
#import "TRWeather.h"
#import "TRDaily.h"
#import "TRDataManager.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //发送请求
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.raywenderlich.com/demos/weather_sample/weather.php?format=json"]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode == 200) {
            //NSData --> JSON Object(NSDictionary/NSArray)
            NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            //解析jsonDic对应值
            [self parseJson:jsonDic];
        }
    }];
    [task resume];
    //接收服务器返回的数据
}

- (void)parseJson:(NSDictionary *)jsonDic {
    //第一种情况: 字典 ---> TRWeather
    //解析(子线程)
    TRWeather *weather = [TRWeather parseJsonByModel:jsonDic];
    //验证
    NSLog(@"humidity:%@", weather.humidity);
   
    //第二种情况: 数组(字典,字典....) ---> 数组(TRDaily,TRDaily....)
    NSArray *weatherArray = jsonDic[@"data"][@"weather"];
    //声明可变数组(存储已经转完的模型对象)
    NSMutableArray *mutableArray = [NSMutableArray array];
    for (NSDictionary *weatherDic in weatherArray) {
        //weatherDic -> TRDaily
        TRDaily *daily = [TRDaily parseJsonByDic:weatherDic];
        [mutableArray addObject:daily];
    }
   
    //验证(mutableArray)
    for (TRDaily *daily in mutableArray) {
        NSLog(@"maxC:%@; minC:%@; url:%@", daily.tempMaxC, daily.tempMinC, daily.iconURL);
    }
   
    //第三种情况: 将控制器中的循环解析封装到TRDataManager中
    NSArray *array = [TRDataManager parseWeatherArray:jsonDic];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
 

追寻最真
原文地址:https://www.cnblogs.com/zhao-jie-li/p/PraseJson.html