如何使用RestKit映射两个相关的JSON?

问题描述 投票:0回答:2

我有两个 JSON,它们看起来像:

{
    "749": {
        "email": "[email protected]",
        "firstname": "Mr",
        "lastname": "Smith"
    }
}

[
    {
        "entity_id": "1",
        "city": "myCity",
        "country_id": "UA",
        "region": null,
        "postcode": "001",
        "telephone": "+38000000001",
        "fax": null,
        "street": [
            "myStrit ",
            "12"
        ],
        "is_default_billing": 1,
        "is_default_shipping": 0
    },
    {
        "entity_id": "2",
        "city": "myCity",
        "country_id": "UA",
        "region": null,
        "postcode": "001",
        "telephone": "+3800000002",
        "fax": null,
        "street": [
            "myStrit2",
            "33"
        ],
        "is_default_billing": 0,
        "is_default_shipping": 1
    }
]

获取第一个 JSON 的路径是

mySite/customers
,第二个 JSON 的路径是
mySite/customers/:userId/addresses

其中

userId
是第一个 JSON 中的未命名属性(在我的示例中为 749)。

我是 RestKit 的新手,我真的不知道如何通过一个请求来映射它......

PS:我从 Magento Rest api 获取这些 JSON。

objective-c magento restkit restkit-0.20 magento-rest-api
2个回答
0
投票

你没有说什么你想映射到什么,但是。

对于第一个 JSON,您需要在映射上使用

addAttributeMappingFromKeyOfRepresentationToAttribute
来提取
749
值并同时将其用作键。

对于第二个 JSON,似乎与第一个 JSON 没有任何连接,因此您需要尝试映射它并返回特定问题。请参阅此页获取指导。


0
投票

RestKit 希望每个对象都由一个可以由映射器处理的字典来描述。不过,您的服务不会返回对象数组,而是返回字典的字典,RestKit 无法将其正确解释为可以单独映射的对象集合。当然,如果您的服务可以返回字典数组,那么问题就会消失。

幸运的是,有一种方法可以在调用映射器之前将您收到的字典字典转换为字典数组。这是通过

-[RKObjectRequestOperation setWillMapDeserializedResponseBlock:]
设置转换块来实现的。

该块接收初始解析的结果(这里是字典的字典),您可以通过调用

-[NSDictionary allValues]
:

轻松地将其转换为字典数组
RKManagedObjectStore *managedObjectStore = ...;
RKResponseDescriptor *responseDescriptor = ...;
NSURLRequest *request = ...;

RKManagedObjectRequestOperation *managedObjectRequestOperation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]];
managedObjectRequestOperation.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext;
[managedObjectRequestOperation setWillMapDeserializedResponseBlock:^id(id deserializedResponseBody) {
    return [deserializedResponseBody allValues];
}];
[[NSOperationQueue currentQueue] addOperation:managedObjectRequestOperation];
© www.soinside.com 2019 - 2024. All rights reserved.