【问题标题】:RestKit Mapping with an array of complex objectsRestKit 与复杂对象数组的映射
【发布时间】:2012-04-02 08:14:58
【问题描述】:

我已经很好地解析了我的 JSON,但我的服务器刚刚改变了我。我的 JSON 曾经看起来像这样:

{
    "blobs": [  
        {
            "createdOn": "2012-03-16T15:13:12.551Z",
            "description": "Fake description",
            "hint": "And a useless hint",
            "id": 400,
            "name": "Fake CA one",
            "publicId": "FF6",
            "type": 0
        },
        {
            "createdOn": "2012-03-16T17:33:48.514Z",
            "description": "No hint on this one, but it does have a description.",
            "hint": "Hint",
            "id": 402,
            "name": "Second fake one in CA",
            "publicId": "FF8",
            "type": 0
        }
    ]
}

我的映射看起来像这样:

RKObjectMapping* blobMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponse class]];

[blobMapping mapKeyPath:@"name" toAttribute:@"name"];
[blobMapping mapKeyPath:@"id" toAttribute:@"blobId"];
[blobMapping mapKeyPath:@"description" toAttribute:@"description"];
[blobMapping mapKeyPath:@"hint" toAttribute:@"hint"];

[[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobs"];

现在我的服务器已经改变,我得到了这个:

{
    "blobsList": {
        "blobs": [  
            {
                "createdOn" :"2012-03-16T15:13:12.551Z",
                "description": "Fake description",
                "hint": "And a useless hint",
                "id": 400,
                "name": "Fake CA one",
                "publicId": "FF6",
                "type": 0
            },
            {
                "createdOn": "2012-03-16T17:33:48.514Z",
                "description": "No hint on this one, but it does have a description.",
                "hint": "Hint",
                "id": 402,
                "name": "Second fake one in CA",
                "publicId": "FF8",
                "type": 0
            }
        ]
    }
}

所以我将它添加到我的映射中:

RKObjectMapping* blobsListMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponseList class]];
[blobsListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"];

[[RKObjectManager sharedManager].mappingProvider setMapping:blobsListMapping forKeyPath:@"blobsList"];

并且是我的课程:

@interface GetResponseInRegionResponse : NSObject
{
    NSString* name;
    NSString* blobId;
    NSString* description;
    NSString* hint;
}       

@interface GetResponseInRegionResponseList : NSObject
{
    NSArray  *blobsList;
}

当我解析这个 JSON 时,我得到一个对象,其中包含 2 个对象的 JKArray,这两个对象都是 JKDictionary 对象。很明显,这是我的数据,但它是 JKDictionary 形式的。它从未映射到 GetResponseInRegionResponse 类!

从阅读 github 文档看来,我想对数组使用 toRelationship 方法,但我只是不知道该放在哪里。如果我按照“文章”示例并尝试以下操作:

[blobListMapping mapKeyPath:@"blobs" toAttribute:@"blobsList"];
[blobListMapping mapKeyPath:@"blobs" toRelationship:@"blobsList" withMapping:blobMapping];

我得到了这个例外:

2012-03-19 14:59:53.704 Ferret[8933:16303] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to add mapping for keyPath blobsList, one already exists...'

那么如何在我的 JSON 中映射一个复杂对象的数组

感谢您的帮助。谢谢!

【问题讨论】:

    标签: ios json restkit


    【解决方案1】:

    你试过只改变

        [[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobsList.blobs"];
    

    反映更改后的数据数组路径?

    【讨论】:

    • 当我这样做时,我得到:。 -- *** 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[ valueForUndefinedKey:]:该类不符合键 ID 的键值编码。”
    • 啊,那是我的错误,JSON 有一个标记为“id”的元素,我有一个名为“blobId”而不是“id”的类成员。但我还需要加入 toRelationship 部分。我从 RestKit 邮件列表中删除了它。如果那个人在这里提出问题的那一部分,我看看我是否可以在你们两个之间分配赏金。非常感谢!
    • JSON 的设置方式不需要关系。在 object "blobList" 中,您直接拥有另一个 object “blob”,并且只有数组存在。如果真的像您的示例中那样,“blobList”将永远不会包含数组。
    • 是的,我需要再检查一下。现在我的 didLoadObject 对象是一个由 3 个对象组成的数组,而不是 2 个对象,即外部对象和 2 个内部对象。真奇怪……我明天试试。谢谢!
    • 是的。我忘了提到你应该保留你原来的设置,只添加上面的一行 - 没有额外的关系......
    【解决方案2】:

    接受的答案似乎针对当前版本 v0.2 之前的版本。我的解决方案看起来略有不同,代码粘贴在下面:

    RKObjectMapping * eventMapping = [RKObjectMapping mappingForClass:[RKJMEvent class]];
    [eventMapping addAttributeMappingsFromDictionary:[RKJMEvent map]];
    
    RKObjectMapping * eventResponseMapping =[RKObjectMapping mappingForClass:[RKJMEventsResponse class]];
    [eventResponseMapping addAttributeMappingsFromDictionary:[RKJMEventsResponse map]];
    [eventResponseMapping addRelationshipMappingWithSourceKeyPath:@"events" mapping:eventMapping];
    
    
    RKResponseDescriptor *responseDescriptorEventResponse = [RKResponseDescriptor responseDescriptorWithMapping:eventResponseMapping
                                                                                        pathPattern:API_GET_EVENTS_PATH
                                                                                            keyPath:nil
                                                                                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    [objectManager addResponseDescriptor:responseDescriptorEventResponse];
    

    【讨论】:

    • 谢谢,但如果它使用问题中的类名和关键路径而不是“事件”等会更清楚。
    • @murrayc 免费编辑我两年前的答案,如果你认为你可以让它更有用!
    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 2017-12-15
    • 2015-11-23
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多