RestKit:映射JSON字符串数组

4

以下是给定的JSON内容:

{
   "someKey":"someValue",
   "otherKey":"otherValue",
   "features":[
      "feature1",
      "feature2",
      "feature3"
   ]
}

我正在使用RKMapperOperationRKEntityMapping将此JSON映射到NSManagedObject中(在此示例中,我将有两个实体映射:一个用于顶级对象,另一个用于我的Feature类)。
顶级对象映射很简单:两个属性映射加上与Feature的关系映射(features)。
我的问题是,如何将features JSON数组映射为Feature对象数组? Feature类只有一个属性name,我想要存储“feature1”,“feature2”等以及对父对象(即顶级对象)的引用。类似于这样:
@interface Feature : NSManagedObject

//In the implementation file both properties are declared with @dynamic.
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) MyTopLevelObject *myTopLevelObject;

@end

有什么想法吗?

它被称为RestKit Relationships。在这里查看维基:https://github.com/RestKit/RestKit/wiki/Object-Mapping#relationships。 - Attila H
3个回答

7
您需要使用空键路径:
RKEntityMapping *featureMapping = [RKEntityMapping mappingForEntityForName:...];
[featureMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"name"]];
featureMapping.identificationAttributes = @[ @"name" ];

然后,在您的顶级对象映射中,定义关系:
[topMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"features" toKeyPath:@"features" withMapping:featureMapping]];

在您的模型中,myTopLevelObject 应该定义为与顶层对象之间的双向关系。

我无法让它工作。这一行是否等同于NSDictionary *featuresAttributeMappings = @{@"name":@"name"}; [featureMapping addAttributeMappingsFromDictionary: featuresAttributeMappings];? - Mazen Kasser
@MazenKasser,不是的,nil是必需的。 - Wain
感谢您的快速回复。是的,抱歉这里需要使用nil。但我的意思是[featureMapping addPropertyMapping...]与[featureMapping addAttributeMappingsFromDictionary:...]是相同的。 - Mazen Kasser
@MazenKasser 假设你不想要一个 nil,是的。 - Wain

7
如果您使用的是Restkit 0.20+,那么您所需要做的就是将表示您实体中字符串数组的属性设置为Transformable。
例如,在这种情况下,您的Feature实体有3个属性:
someKey - String
otherKey - String
features - Transformable

Restkit会自动将“features”映射为字符串数组。

一旦映射完成,访问features数组中的一个字符串就像这样简单:

[Feature.features objectAtIndex:?]

我刚试过了,它完美地工作了。


这是一个很好的解决方案。所以你的意思是只创建一个名为Feature的实体。如果我的Features是一个具有不同键值的对象,那该怎么办?创建另一个名为Features的实体,但是如何实现呢? - Mazen Kasser

1

我认为你不能像那样映射一个字符串数组到ManagedObject。但是,由于Feature只有一个name属性,你可以将其作为数组存储到你的MyTopLevelObject中。你可以通过在数据模型的MyTopLevelObject中添加一个类型为Transformablefeatures属性来实现这一点。RestKit会自动解析特性成为一个包含NSString的NSArray。然后,你可以按照以下方式获取这些特性:

MyTopLevelObject *topLevelObject = ... // get the object from the persistent store
NSArray *features = (NSArray*)topLevelObject.features; // this will contain the features as NSString objects

哇,你真是个救星。我浪费了两天时间,之前从未听说过Transformable。谢谢。 - Mazen Kasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接