JsonMode json嵌套解析

本文介绍了如何使用JsonModel库进行JSON数据的嵌套解析。通过创建继承自JSONModel的基类,重写keyMapper和propertyIsOptional方法,以及为不同层级的数据创建对应的模型类,实现了对服务器返回的复杂数据结构进行解析。示例中展示了Model、DataModel和MemberModel三个类的定义,以及如何使用initWithDictionary: error:方法进行实例化。

上一片文章:iOS Json转Model (一)中提及了jsonModel这个开源库:这里介绍一下它的(嵌套解析)用法。

以下是从服务器获得的数据:


1.首先声明一个继承JSONModel的基类:

//.h

#import "JSONModel.h"


@interface BaseModel : JSONModel

@end


//.m

@implementation BaseModel


/**用于将服务器传过来的以下划线字段转化为模型的驼峰类型:比如上面的available_predeposit, 但模型中我们的字段如果我们写为(通常我们都这么写)availablePredeposit,如果不重写该函数则availablePredeposit就无法赋值*/

+ (JSONKeyMapper *)keyMapper {

    return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];

}


/**声明模型中的字段可以存在或不存在服务器的字段,

 否则模型不会被赋值,比如说下面的Model中如果有字段code1,如果没这样重写这个方法,这整个model就不会被赋值,解析的结果是nil。

 */

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

    return YES;

}


@end


二、我们发现数据的根字段有:info、code以及data三个字段,而data下又有member字段,member下又有不可分割的字段

所以我们需要声明个模型

模型 1

@interface Model : BaseModel

@property (nonatomic, strong) DataModel *data;  //注意字段“data”必须和服务器的字段相同,不能写成data1或其他的

@property (nonatomic, copy) NSString *info;       //

@property (nonatomic, assign) NSInteger code;

@end


模型 2

@interface DataModel : BaseModel

@property (nonatomic, strong) MemberModel *member;

@end


模型 3

@interface MemberModel : BaseModel

@property (nonatomic, copy) NSString *points;

@property (nonatomic, copy) NSString *mobile;

@property (nonatomic, copy) NSString *nick;

@property (nonatomic, copy) NSString *id;

@property (nonatomic, copy) NSString *avatar;

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *availablePredeposit;

@end


三、使用方法:

Model *model = [[Model alloc] initWithDictionary:dataDic error:nil]; //这里的dataDic就是从服务器放回的数据

然后mode中的所有字段都被赋值了,然后你需要name的时候,mode.data.member.name就可以, 是不是既方便又结构清晰。



### 解析包含嵌套数组的JSON数据 在处理复杂的JSON结构时,特别是当这些结构中包含了嵌套数组的情况下,在Hive中的确存在一定的挑战。为了有效地解析这种类型的JSON文档并提取所需的数据,可以利用`openx-jsonserde`工具来简化这一过程[^1]。 对于带有复杂结构如嵌套对象或数组的JSON文件来说,并不需要定义整个模式(schema),但是建议尽可能详尽地描述预期读取的部分。如果遇到不同版本间字段有所变化的情况——比如提到的第一版和第二版JSON文档之间的差异,则可以通过灵活配置SerDe参数适应这种情况下的变动而不必重新设计整体架构。 具体到操作层面,假设有一个存储于字符串列`json_column`内的JSON记录,其中含有名为`items`的数组属性: ```sql -- 创建临时函数以便使用OpenX JSON Serde ADD JAR /path/to/json-serde.jar; CREATE TEMPORARY FUNCTION json_tuple AS 'org.openx.data.jsonserde.JsonTuple'; -- 使用LATERAL VIEW explode() 来展开数组项 SELECT t.item['key_name'] as key_value FROM ( SELECT explode(json_tuple(cast(json_column AS string), 'items')) AS item FROM your_table ) t; ``` 上述SQL语句展示了如何通过创建临时函数引入外部库支持,进而调用特定方法完成对目标路径下JSON序列化数据的操作;接着借助`LATERAL VIEW explode()`实现将单个单元格内部多个值按照一定规则拆分成多行显示的效果。 值得注意的是,虽然这里展示的例子仅涉及到了一层深度的数组解析,但在实际应用当中可能还会碰到更深层次的对象嵌套情况。此时可以根据实际情况调整查询逻辑以满足需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值