获取嵌套的自定义字段 JSON Objective C
Posted
技术标签:
【中文标题】获取嵌套的自定义字段 JSON Objective C【英文标题】:Get nested custom fields JSON Objective C 【发布时间】:2014-04-04 16:14:15 【问题描述】:我在 Objective C 中得到的 JSON 有点问题
这是 JSON:
"id": 264,
"type": "products",
"slug": "dali",
"url": "http://localhost/?products=dali",
"status": "publish",
"title": "Dali",
"title_plain": "Dali",
"content": "",
"excerpt": "",
"date": "2014-03-25 15:47:16",
"modified": "2014-04-04 15:52:52",
"categories": [
"id": 26,
"slug": "juices-2",
"title": "Juices",
"description": "",
"parent": 0,
"post_count": 1
],
"tags": [],
"author":
"id": 1,
"slug": "arturocalvo",
"name": "arturocalvo",
"first_name": "",
"last_name": "",
"nickname": "arturocalvo",
"url": "",
"description": ""
,
"comments": [],
"attachments": [],
"comment_count": 0,
"comment_status": "closed",
"custom_fields":
"tipo_de_producto": [
"bebida"
],
"tipo_de_bebida": [
"jugo"
],
"product_0_sucursal": [
"2"
],
"product": [
"1"
],
"product_0_sizes_0_size": [
"s"
],
"product_0_sizes_1_size": [
"m"
],
"product_0_sizes_2_size": [
"l"
],
"product_0_sizes": [
"3"
],
"product_0_prices_0_price": [
"20"
],
"product_0_prices_1_price": [
"25"
],
"product_0_prices_2_price": [
"30"
],
"product_0_prices": [
"3"
]
当我用 ResKit 映射它时,我想将 3 种不同的大小存储在一个数组中,我在下面的类中:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "ProductPrice.h"
@class Categories, ProductPrice;
@interface AllProducts : NSObject
@property (nonatomic, copy) NSString * name;
@property (nonatomic, copy) NSSet * productType;
@property (nonatomic, copy) NSSet * locationId;
@property (nonatomic, copy) NSArray * sizes;
@property (nonatomic, copy) NSSet * productCategoryId;
@end
这是对象映射代码:
//Products Mapping
RKObjectMapping *productsMapping = [RKObjectMapping mappingForClass:[AllProducts class]];
[productsMapping addAttributeMappingsFromDictionary:@
@"title": @"name",
@"custom_fields.product_0_sucursal": @"locationId",
@"custom_fields.tipo_de_producto": @"productType",
@"categories.id": @"productCategoryId"
];
我遇到的问题是 JSON 的键带有 3 个不同的数字,product_0_sizes_0_size 然后从 0 到 2,我不知道在映射代码中输入什么,谁能帮助我?,谢谢提前
【问题讨论】:
所以键是静态的,但是不读product_0_sizes
不知道会有多少?可能有很多?而且您没有机会更改 JSON?
没错,不幸的是JSON来自wordpress,我无法更改它,它可能有10个以上的大小,那么,有办法处理吗?
你知道,你可以只写代码。这比试图扭曲 ResKit 做它不想做的事情要快。
【参考方案1】:
嗯,你的情况有点垃圾(由于不愉快的 JSON)。如果你有这个选项,你应该改变它。
你不能,我认为最好的选择是创建一个动态映射,用作响应描述符的映射。该映射返回一个根据您当前拥有的映射创建的映射,并根据product_0_sizes
的内容在循环中添加以生成源密钥路径。
现在,事情变得更加不愉快,因为每个目标键只能有一个映射,而且您显然有多个源键要合并到一个目标键。
我会尝试滥用 setValue:forUndefinedKey:
来解决这个问题。如果您将目标键创建为appendSize0
,appendSize1
,...而不在类上创建这些属性,则应在目标类上为映射的每个源键调用setValue:forUndefinedKey:
。在您的setValue:forUndefinedKey:
实现中,您可以提取提供的值并将它们附加到您真正的sizes
数组中。
(注意:我没有直接尝试过,但它应该可以工作。数据类型突变的类型自省存在问题的风险......)
(注意:如果您收到的密钥不是以appendSize
开头的,则您的setValue:forUndefinedKey:
实现应该调用super
)
滥用setValue:forUndefinedKey:
肯定是最少的代码。另一种方法是添加一整堆可以映射到的属性,但这不是很好或灵活。
【讨论】:
以上是关于获取嵌套的自定义字段 JSON Objective C的主要内容,如果未能解决你的问题,请参考以下文章
如何获取嵌套 JSON 值并将其加载到 Tableview Objective c 中?