java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)

2018.11.14日更新

前言

没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐

在这一个月的项目中,总是用到JSONModel,此时从头会看这篇文章,各种小错乃至严重的低级错误不断,实在愧对我的读者,在这里先道个歉。

今天正好有空,我把有问题的地方都修改一下,希望能对点进来看的人有所帮助

更新内容

NSArray关键词修改为copy

使用协议,在最后使用的时候不用新建类,而是可以直接使用方法调用

添加如果API中有ID,image等与原来自带方法撞名的,该如何修改类名

添加方法避免类中属性比借口多

githubDemo同样更新了

使用API

参考的JSON数据(可能与你看到的不同)

{

"date": "20181020",

"stories": [

{

"title": "每周一吸 · 狸花猫",

"ga_prefix": "102013",

"images": [

"https://pic4.zhimg.com/v2-9ef6021d279be280f7d2ba0788e392a7.jpg"

],

"multipic": true,

"type": 0,

"id": 9698943

},

{

"images": [

"https://pic3.zhimg.com/v2-b752576f81b0a584bcf0e2ba96a07666.jpg"

],

"type": 0,

"id": 9698988,

"ga_prefix": "102012",

"title": "大误 · 救救马云"

},

{

"images": [

"https://pic2.zhimg.com/v2-8502d8246509a273ba97133e0064176d.jpg"

],

"type": 0,

"id": 9698610,

"ga_prefix": "102010",

"title": "药瓶上的「肝肾功能不全者慎用」,到底想表达什么?"

},

{

"images": [

"https://pic4.zhimg.com/v2-352a7a8539dfd84227b22c8574f327b7.jpg"

],

"type": 0,

"id": 9698819,

"ga_prefix": "102009",

"title": "孩子你终于长大了,2 岁正是学理财的好时候"

},

{

"images": [

"https://pic1.zhimg.com/v2-bad6709dfc4abe08b9cacf5c75c03d00.jpg"

],

"type": 0,

"id": 9698931,

"ga_prefix": "102008",

"title": "「生命之桥」上,失落的人们选择在这里结束生命"

},

{

"images": [

"https://pic4.zhimg.com/v2-1b3b1acab0c685beaa5428f33c7c6c03.jpg"

],

"type": 0,

"id": 9698898,

"ga_prefix": "102007",

"title": "作为电影导演 / 歌手,作品信息量这么大,我自己都不知道"

},

{

"images": [

"https://pic3.zhimg.com/v2-d7a69c5474650820fce977064458d35e.jpg"

],

"type": 0,

"id": 9699031,

"ga_prefix": "102007",

"title": "13 岁少女肢解同窗好友,也许我们都小看她了"

},

{

"images": [

"https://pic2.zhimg.com/v2-abe3c9ea2cdfe8051ea36154d30b4989.jpg"

],

"type": 0,

"id": 9698984,

"ga_prefix": "102006",

"title": "瞎扯 · 如何正确地吐槽"

}

],

"top_stories": [

{

"image": "https://pic4.zhimg.com/v2-9b704e39dc83ae7202fefc8d192e10f3.jpg",

"type": 0,

"id": 9699031,

"ga_prefix": "102007",

"title": "13 岁少女肢解同窗好友,也许我们都小看她了"

},

{

"image": "https://pic2.zhimg.com/v2-66f79486c79deb9d779f9af99e719091.jpg",

"type": 0,

"id": 9699060,

"ga_prefix": "101921",

"title": "影视圈惊变 2018"

},

{

"image": "https://pic4.zhimg.com/v2-e093102accf700073af6c3452293cd27.jpg",

"type": 0,

"id": 9698862,

"ga_prefix": "101719",

"title": "「56 个星座,56 支花」……等等,不是 56 个民族吗?"

},

{

"image": "https://pic4.zhimg.com/v2-76f03b3ab26c3d76be022a5281a13483.jpg",

"type": 0,

"id": 9698744,

"ga_prefix": "101810",

"title": "花海沦陷在抖音网红的臀下,想要提前避免,可能真没什么辙"

},

{

"image": "https://pic3.zhimg.com/v2-5babbbaa37cccaf467b996e9bc1aadda.jpg",

"type": 0,

"id": 9698809,

"ga_prefix": "101807",

"title": "大学校园沦为艾滋病重灾区?一直如此,形势也越来越严峻"

}

]

}

参考文章(阅读顺序排列, 对于基本的不再赘述)

GitHub地址

易错点

可以看到我们要解析的这个JSON数据是相当复杂的, 他有嵌套, 有数组, 需要一次解析, 在阅读了上面的文章以后, 应该对如何处理有了自己的看法, 我这里放一个我觉得比较好的的方法。

首先要说明一下, JSONModel的作用说白了就是将JSON数据依照关键字,变成一个类的属性, 方便使用, 它的强大之处在于能够完成数据形式的转换

那么我要说的是, 在嵌套数据时, 我们应该对每一个要嵌套的都写成一个类,但并不是意味着要写成多个类文件,而是只需要在一个类文件里把该有的写好就行

//

// Top_storiesJSONModel.h

// JSONModel-exerciseDemo

//

// Created by mac on 2018/10/19.

// Copyright © 2018 姜凯文. All rights reserved.

//

#import "JSONModel.h"

@protocol Top_storiesJSONModel

@end

@protocol StoriesJSONModel

@end

NS_ASSUME_NONNULL_BEGIN

@interface Top_storiesJSONModel : JSONModel

@property (nonatomic, copy) NSString *imageStr;

@property (nonatomic, copy) NSString *type;

@property (nonatomic, copy) NSString *ID;

@property (nonatomic, copy) NSString *ga_prefix;

@property (nonatomic, copy) NSString *title;

@end

@interface StoriesJSONModel : JSONModel

@property (nonatomic, copy) NSArray *images;

@property (nonatomic, copy) NSString *type;

@property (nonatomic, copy) NSString *id;

@property (nonatomic, copy) NSString *ga_prefix;

@property (nonatomic, copy) NSString *title;

@end

@interface TotalJSONModel : JSONModel

@property (nonatomic, copy) NSString *date;

@property (nonatomic, copy) NSArray*top_stories;

@property (nonatomic, copy) NSArray*stories;

@end

NS_ASSUME_NONNULL_END

//

// Top_storiesJSONModel.m

// JSONModel-exerciseDemo

//

// Created by mac on 2018/10/19.

// Copyright © 2018 姜凯文. All rights reserved.

//

#import "Top_storiesJSONModel.h"

@implementation StoriesJSONModel

+(BOOL)propertyIsOptional:(NSString *)propertyName{

return YES;

}

@end

@implementation Top_storiesJSONModel

+(BOOL)propertyIsOptional:(NSString *)propertyName{

return YES;

}

+ (JSONKeyMapper *)keyMapper {

return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{

@"ID":@"id",

@"imageStr":@"image"

}];

}

@end

@implementation TotalJSONModel

+(BOOL)propertyIsOptional:(NSString *)propertyName{

return YES;

}

@end

关键代码说明

NSLog(@"---test---%@----", [totalJSONModel.top_stories[0] imageStr]);//最后调用时,最后一项不能直接使用点语法调用,需要使用get方法

+ (JSONKeyMapper *)keyMapper {

return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{

@"ID":@"id",

@"imageStr":@"image"

}];

}

这一段换名字是为了避开id这个关键字,以及image是OC的自带方法,直接使用会导致失败

+(BOOL)propertyIsOptional:(NSString *)propertyName{

return YES;

}

这句话使用,就算API中没有请求到类中的,映射有问题也不会报错(直接忽略)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值