一步步教你拦截网易新闻进行 JSON 转模型
JSON
直到世界尽头
5人收藏 5848次学习

一步步教你拦截网易新闻进行 JSON 转模型

本篇文章的主要知识点是:

1 用青花瓷Charles拦截网易新闻的json的网址

2 分析数据

3 Json转模型

1. 用青花瓷拦截网易新闻的json的网址

a.

我们可以得到网易新闻客户端的头条板块的json实时数据:

http://c.m.163.com/nc/article/headline/T1348647853363/0-20.html

b. 把获得的网址用浏览器打开 然后找到之前我介绍的json格式化工具展示数据

整个网易新闻的头条界面是一个字典 只有一个键值对,键和值分别是一个字符串和一个数组(下图所示)。

展开之后发现数组的每一项是一个字典,于是我们就可以字典转模型了。

2. 分析数据

a. 创建项目

b. 导入AFN框架(最好使用cocoaPods)

c. 建立网络工具类继承自 AFHTTPSessionManager

.h

#import "AFHTTPSessionManager.h"
@interface NetworkTools : AFHTTPSessionManager
+(instancetype)sharedManager;
@end

.m

#import "NetworkTools.h"
@implementation NetworkTools
+(instancetype)sharedManager
{
    
    static NetworkTools *tools;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        //基础路径
        NSURL *baseURL = [NSURL URLWithString:@"http://c.m.163.com/nc/article/headline/"];
        
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        
        tools = [[self alloc] initWithBaseURL:baseURL sessionConfiguration:config];
        
        
    });
    
    return tools;
}
@end

d. 控制器

-(void)loadData
{
    [[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"%@",responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
    }];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    [self loadData];
    
}

打印 发现打印的是字典

e. 获取字典的键

-(void)loadData
{
    [[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, NSDictionary * responseObject) {
        NSLog(@"%@",responseObject.keyEnumerator);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
    }];
}

再次打印 

-(void)loadData
{
    [[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, NSDictionary * responseObject) {
        NSLog(@"%@",responseObject.keyEnumerator.nextObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
    }];
}

现在我们就拿到键了

f. 获取字典数组

-(void)loadData
{
    [[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, NSDictionary * responseObject) {
NSLog(@"%@",responseObject.keyEnumerator.nextObject);
        //所以我们就可以直接拿到字典的数组
        NSArray *array = responseObject[responseObject.keyEnumerator.nextObject];
        NSLog(@"%@",array);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
    }];
}

3. Json转模型

a. 新建一个模型

News.h

#import <Foundation/Foundation.h>
@interface News : NSObject
/**
 *  标题
 */
@property (nonatomic, copy) NSString *title;
// 摘要
@property (nonatomic, copy) NSString *digest;
// 跟贴数量
@property (nonatomic, assign)NSInteger replyCount;
// 配图地址
@property (nonatomic, copy) NSString *imgsrc;
+ (instancetype)newsWithDict:(NSDictionary *)dict;
@end

.m现在不要写

b. 控制器

-(void)loadData
{
    [[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, NSDictionary * responseObject) {
        NSLog(@"%@",responseObject.keyEnumerator);
        //所以我们就可以直接拿到字典的数组
        NSArray *array = responseObject[responseObject.keyEnumerator.nextObject];
        
        //字典转模型
        NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:array.count];
        for(NSDictionary *dict in array)
        {
            [arrayM addObject:[News newsWithDict:dict]];
        }
        
        
        NSLog(@"%@",array);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
    }];
}

c. 如果按照之前的思路实现KVC字典转模型

+ (instancetype)newsWithDict:(NSDictionary *)dict;

那么运行一定会崩溃,因为我们获取的键的个数多于模型中的键的个数,所以这样实现模型的类。

News.m

#import "News.h"
@implementation News
+ (instancetype)newsWithDict:(NSDictionary *)dict {
    id obj = [[self alloc] init];
    
//    [obj setValuesForKeysWithDictionary:dict];
    NSArray *properties = [self properties];
    
    // 遍历属性数组
    for (NSString *key in properties) {
        // 判断字典中是否包含这个key
        if (dict[key] != nil) {
            // 使用 KVC 设置数值
            [obj setValue:dict[key] forKeyPath:key];
        }
    }
    
    return obj;
}
+ (NSArray *)properties {
    return @[@"title", @"digest", @"replyCount", @"imgsrc", @"haha"];
}
- (NSString *)description {
    
    NSArray *properties = [News properties];
    NSDictionary *dict = [self dictionaryWithValuesForKeys:properties];
    
    return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, dict];
}
@end

现在运行

现在我们拿到模型数组了。

加入1KE学习俱乐部

1KE学习俱乐部是只针对1KE学员开放的私人俱乐部
标签:
JSON