2

使用 RestKit 0.10.1,我提供了类似于这种 json 格式的对象:

{"objects": [
    {"owner": 1, 
     "_id": 823, 
     "data": {
         "diam": 5.0, 
         "plant_date": "10/02/2008"}
    }, 
     ...   ] }

在客户端,我不需要子对象或关系,所以我将对象的属性展平:

[myMapping mapKeyPathsToAttibutes: 
    @"_id", @"id", 
    @"owner", @"owner", 
    @"data.diam", @"diam", //here is what I mean by flatten; notice data.diam -> diam
    @"data.plant_date", @"plant_date", nil];

我读取这些数据没有问题,但是当我想序列化它时,只有顶级属性被发送到服务器。当我序列化时,这是服务器得到的:

{"_id":0,"owner":1}

请注意,我已经正确(我认为)使用上述的 inverseMapping 注册了序列化映射:

[objectManager.mappingProvider setSerializationMapping:[myMapping inverseMapping] forClass:[MyClass class]];

我像这样发布对象时:

myObject = [MyClass object];
myObject.diam = [NSNumber numberWithInt:5];
myObject.plant_date = myDate;

[[RKObjectManager sharedManager] postObject:myObject delegate:self];

我想要一个完整的、不扁平的结构:

{"_id":0,"owner":1, "data": {"diam": 5.0, "plant_date": "10/02/2008"} }

如何使用 RestKit 实现将注册对象映射到服务器的键路径(即“data.diam”)?

4

2 回答 2

3

这看起来像是 RestKit 中的一个错误。您可以使用以下代码段重现它:

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);

NSDictionary* src = [NSDictionary dictionaryWithObjectsAndKeys: @"cat", @"animal", nil];
NSMutableDictionary* dst = [NSMutableDictionary dictionary];

RKObjectMapping* mapping = [RKObjectMapping mappingForClass: [NSDictionary class]];
[mapping mapKeyPath: @"type.animal" toAttribute: @"animal"];

RKObjectMappingOperation* op = [[RKObjectMappingOperation alloc] initWithSourceObject: src
                                                                    destinationObject: dst 
                                                                              mapping: [mapping inverseMapping]];

NSError* error = nil;
[op performMapping: &error];

如果您查看日志,您将看到这一行:

restkit.object_mapping:RKObjectMappingOperation.m:258 目标对象 {} 拒绝 keyPath type.animal 的属性值 cat。跳过...

失败的方法是 -validateValue:forKeyPath:error: 因为关系组件不存在。我建议您在 RestKit github 上打开错误/问题报告。

于 2012-07-16T07:04:58.923 回答
2

请注意,此错误已在 RestKit 中修复,以便在 0.20 中发布。查看变更集@ https://github.com/RestKit/RestKit/commit/64e9c7cb6d04dd8750e9f663fc998bbe738945e9

于 2012-10-16T02:01:41.050 回答