2012-03-16 76 views
4

我一直在很好地解析我的JSON,但我的服务器只是改变了我。我的JSON用于这个样子:RestKit使用复杂对象数组映射

{ 
    "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里面?

我很感激任何帮助。谢谢!

回答

2

您是否尝试过只改变

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

,以反映更改路径,您的数据阵列?

+0

当我这样做,我得到:。 - ***因未捕获异常'NSUnknownKeyException'而终止应用程序,原因:'[ valueForUndefinedKey:]:此类不是键编码兼容的密钥ID'。 – 2012-03-19 20:21:37

+0

啊,那是我的错误,JSON有一个标记为“id”的元素,我有一个名为“blobId”的类成员而不是“id”。但我还需要有关系部分。我从RestKit邮件列表中取得了这个结果。如果那个人在这里遇到这个问题的一部分,我会看看我是否可以分裂你们两个人之间的恩赐。非常感谢! – 2012-03-19 20:48:03

+0

您的JSON设置的方式不需要关系。在_object_“blobsList”里面你直接有另一个_object_“blob”,只有你有这个数组。 “blobList”永远不会包含数组,如果它真的像你的例子。 – k1th 2012-03-19 20:58:31

3

接受的答案似乎是针对当前版本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]; 
+0

谢谢,但如果它使用类名称和关键路径,而不是“事件”等问题,则会更清楚。 – murrayc 2015-05-02 09:19:30

+0

@murrayc费用可自由编辑我两年前的答案,如果您认为可以做到这一点更有用! – deepwinter 2015-05-04 20:15:25