如何将展平的对象序列化回服务器,在 RestKit 中未展平
Posted
技术标签:
【中文标题】如何将展平的对象序列化回服务器,在 RestKit 中未展平【英文标题】:How to serialize a flattened object back to server, unflattened in RestKit 【发布时间】:2012-07-16 02:05:02 【问题描述】:使用 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”)?
【问题讨论】:
【参考方案1】:这看起来像是 RestKit 中的一个错误。您可以使用以下 sn-p 重现它:
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 目的地 object 拒绝了 keyPath type.animal 的属性值 cat。 跳过...
失败的方法是-validateValue:forKeyPath:error: 因为关系组件不存在。我建议您在 RestKit github 上打开错误/问题报告。
【讨论】:
感谢您的测试。你能建议一个解决方法吗?因为我目前的解决方法非常难看:我发布***对象,并在响应后发布相关数据。与此同时,我在github 上开了一个问题 我会创建一个具有正确格式的间歇性 NSDictionary 并发布(使用正确的映射)而不是实际对象。【参考方案2】:请注意,此错误已在 RestKit 中修复,以便在 0.20 中发布。查看变更集@https://github.com/RestKit/RestKit/commit/64e9c7cb6d04dd8750e9f663fc998bbe738945e9
【讨论】:
以上是关于如何将展平的对象序列化回服务器,在 RestKit 中未展平的主要内容,如果未能解决你的问题,请参考以下文章
Restkit 0.24.0:如何将对象(包括对多关系)序列化为 JSON
你如何在 RestKit 0.20 中使用 RKDotNetDateFormatter?