zoukankan      html  css  js  c++  java
  • 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
     

    追寻最真
  • 相关阅读:
    c语言排序算法
    冒泡 选择排序
    冒泡排序算法
    Pandas数据预处理
    Mongodb的安装和配置
    Mysql练习题
    5 根据过去的行为能否预测当下
    Sklearn逻辑回归
    4 如何通过各种广告组合获取更多的用户
    Sklearn多元线性回归
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/PraseJson.html
Copyright © 2011-2022 走看看