RestKit 0.20 映射字符串数组



所以在阅读了这个答案之后,我看不出我的情况有什么不同,但提出的解决方案似乎在 RestKit 0.20.3 中不起作用

对于以下 json:

{
   "photos": [
      "872ac577-3f31-47a0-966e-6f2ed2fbabcd"
     ],
   "imageUrl": [
      "http://domain/WebAPI/FileUpload/10232013629_21382571406.439790.jpeg"
     ]
}

映射到以下对象:

@class Picture, Site, Survey;
@interface Job : NSManagedObject
@property (nonatomic, retain) NSString * jobId;
@property (nonatomic, retain) NSString * jobName;
@property (nonatomic, retain) NSString * jobStatusId;
@property (nonatomic, retain) NSString * jobStatus;
@property (nonatomic, retain) NSString * projectId;
@property (nonatomic, retain) NSString * projectType;
@property (nonatomic, retain) NSString * siteId;
@property (nonatomic, retain) NSSet *surveys;
@property (nonatomic, retain) NSSet *photos;
@property (nonatomic, retain) NSDate *createdDate;
@property (nonatomic, retain) Site *site;
@end

其中photos是一个Picture对象,如下所示:

@interface Picture : NSManagedObject
@property (nonatomic, retain) NSData * data;
@property (nonatomic, retain) NSString * photoId;
@property (nonatomic, retain) NSString * pictureLoc;
@property (nonatomic, retain) NSString * imageUrl;
@property (nonatomic, retain) Job *job;
@property (nonatomic, retain) QuestionAnswer *question;
@end

我想将photosimageUrl分别映射到PicturephotoIdimageUrl中。我想我可以在我的Job映射中使用以下:

RKEntityMapping *ret = [RKEntityMapping mappingForEntityForName:@"Job" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore ];
[ret addAttributeMappingsFromDictionary: @{
                                           @"photos": @"photos.photoId",
                                           @"imageUrl": @"photos.imageUrl",
                                           }];

但是,映射的Job最终总是在 photos 属性中没有任何内容。

我知道我正在正确执行所有中间步骤(例如实际使用 ret 进行映射),因为 JSON 是一个包含许多其他键的代码片段,我可以毫无问题地映射。我做错了什么?请告诉我

编辑

根据韦恩的回答更改了映射代码:

RKEntityMapping *ret = [RKEntityMapping mappingForEntityForName:@"Job" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore ];
RKEntityMapping *subMapping = [RKEntityMapping mappingForEntityForName:@"Picture" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore ];
[subMapping addAttributeMappingsFromDictionary: @{
                                           @"photos":@"photoId",
                                           @"imageUrl":@"imageUrl"
                                           }];

[ret addPropertyMapping:[RKRelationshipMapping
                         relationshipMappingFromKeyPath:nil 
                         toKeyPath:@"photos" 
                         withMapping:subMapping]];

现在我添加了一个Picture对象,但nil用于photoIdimageUrl(是的,我检查以确保 JSON 键的拼写和大小写正确)

photos 中没有任何内容的原因是您的映射没有告诉它创建一个新对象。

问题在于如何告诉它创建一个对象并将两个参数都设置到其中。问题是因为你有 2 个不同的数组。我希望您拥有的 JSON 是 1 个数组,其中包含包含该特定条目的所有详细信息的字典。RestKit 可以处理这两个数组,但它会导致创建 2 个不同的photo对象。为此,您需要使用nil键路径以及从ret到该新映射的关系进行第二个映射。

另一种方法是更改 Job 对象,使其具有 2 个可转换(或瞬态)属性,这些属性NSArray s。如果您将ret设置为仅映射@"photos" : @"photos"@"imageUrl" : @"imageUrl"则 RestKit 将映射所有数据,而不是映射到photo对象。然后,如果需要,您可以在映射完成后更改此数据...

最新更新