获取嵌套的自定义字段 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: 来解决这个问题。如果您将目标键创建为appendSize0appendSize1,...而不在类上创建这些属性,则应在目标类上为映射的每个源键调用setValue:forUndefinedKey:。在您的setValue:forUndefinedKey: 实现中,您可以提取提供的值并将它们附加到您真正的sizes 数组中。

(注意:我没有直接尝试过,但它应该可以工作。数据类型突变​​的类型自省存在问题的风险......)

(注意:如果您收到的密钥不是以appendSize 开头的,则您的setValue:forUndefinedKey: 实现应该调用super

滥用setValue:forUndefinedKey: 肯定是最少的代码。另一种方法是添加一整堆可以映射到的属性,但这不是很好或灵活。

【讨论】:

以上是关于获取嵌套的自定义字段 JSON Objective C的主要内容,如果未能解决你的问题,请参考以下文章

如何获取嵌套 JSON 值并将其加载到 Tableview Objective c 中?

序列化 DRF 中的自定义相关字段

Ruby 中嵌套复杂对象的自定义 to_json

如何通过 gson 将 json 反序列化为嵌套的自定义地图?

用于深层嵌套对象的自定义Json Serializer

java解析Json中获取Array字段值及嵌套Json对象