RKEntityMapping JSON 数组 RKResponseDescriptor 键路径问题可能
Posted
技术标签:
【中文标题】RKEntityMapping JSON 数组 RKResponseDescriptor 键路径问题可能【英文标题】:RKEntityMapping JSON array RKResponseDescriptor keypath issue possibly 【发布时间】:2013-10-22 22:32:55 【问题描述】:我正在尝试将我的核心数据“组件”实体映射到此响应 JSON 中的“热点”键路径,但它只到达数组对象,因此它不会映射。我不知道我的问题是映射还是响应描述符或两者的组合。
"result" :
"type" : "Slidedeck",
"id" : 81,
"name" : "Brendantest",
"slides" : [
"thumb" : "http:\/\/api.idetailapp.review.thingee.com\/v4\/resources\/1294\/download\/slide?thumb=true",
"id" : 1294,
"notes" : "",
"label" : "",
"order" : 1,
"parent_id" : 81,
"file" : "slide-20.jpg",
"components" :
"hotspots" : [
"x" : 205,
"options" : "embedded",
"type" : "video",
"id" : 6082,
"y" : 453,
"assets" : [
"thumb" : "\/system\/asset_objects\/14\/original_thumb\/14.png",
"id" : 14,
"parent_id" : 6082,
"file" : "slide_15_chart_animation_ipad_r03.mov",
"url" : "http:\/\/api.idetailapp.review.thingee.com\/v4\/resources\/14\/download\/asset"
],
"parent_id" : 1294,
"width" : 320,
"height" : 246
]
,
"url" : "http:\/\/api.idetailapp.review.thingee.com\/v4\/resources\/1294\/download\/slide"
],
"version" : "0.43"
这是我的 RKEntityMapping:
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Component"
inManagedObjectStore:[RKManagedObjectStore defaultStore]];
mapping.identificationAttributes = @[ @"componentID" ];
[mapping addAttributeMappingsFromDictionary:@@"id": @"componentID",
@"parent_id": @"parentID"
];
[mapping addAttributeMappingsFromArray:@[@"x", @"y", @"width", @"height", @"type", @"options"]];
这是我的响应描述符:
componentResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:componentEntityMapping
method:RKRequestMethodAny pathPattern:nil
keyPath:@"result.slides.components.hotspots" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
我输入了一个 RestKit/ObjectMapping 调试跟踪并得到以下输出:
Asked to map source object (
assets = (
file = "slide_15_chart_animation_ipad_r03.mov";
id = 14;
"parent_id" = 6082;
thumb = "/system/asset_objects/14/original_thumb/14.png";
url = "http://api.idetailapp.review.thingee.com/v4/resources/14/download/asset";
);
height = 246;
id = 6082;
options = embedded;
"parent_id" = 1294;
type = video;
width = 320;
x = 205;
y = 453;
以及进一步的调试信息:
将 keyPath 'id' 处的值转换为类型 'NSNumber' 的表示失败:错误 Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 “值转换失败”(
6082
)UserInfo=0x12479350 NSLocalizedDescription=期望inputValue
类型为NSNull
,但得到__NSArrayI
。"
),
【问题讨论】:
在 JSON 中,slides
是否只有 1 个元素? (你的映射比我预期的更远......)
@Wain 这只是一个基本的 JSON 回复,通常会有很多幻灯片元素
【参考方案1】:
你的问题是keyPath:@"result.slides.components.hotspots"
。
具体来说,slides
是一个数组。
结果是要求 RestKit 将对象数组映射到您的映射中。因此,当它尝试获取 id
(应该是一个数字)时,它会得到一个数组(因此你的错误)。这是因为在数组上调用valueForKey:
会返回一个数组...
因此,基本上,由于 JSON 中间的数组,您无法按照您尝试的方式进行操作。
如果您可以更改 JSON,请执行此操作。如果不能,则需要更改映射以先映射slides
,然后再映射嵌套组件(然后如果需要,您可以丢弃幻灯片)。
【讨论】:
我应该如何先映射到slides
,然后再映射到嵌套的hotspots
组件?
您将需要一个新的映射和实体,更改响应描述符以使用新的映射,添加 2 个实体和 2 个映射之间的关系。
您能否确认我的工作方向正确,首先我将为slides
创建一个RKEntityMapping 和实体,更改响应描述符以反映slides
。为hotspots
创建实体和映射,其中将包括两者之间的关系。然后,在我为slides
执行请求操作后,hotspots
实体将根据定义的关系获取其数据,无需单独的请求操作来获取hotspots
的数据。这看起来正确吗?还是我错过了什么?谢谢
你的映射对于组件来说是可以的(你不需要一个名为one的热点),你只需要添加关系。是的其他实体和映射。对于响应描述符,请记住更改密钥路径。在没有第二次请求的情况下更正加载(因为数据是嵌套的)。以上是关于RKEntityMapping JSON 数组 RKResponseDescriptor 键路径问题可能的主要内容,如果未能解决你的问题,请参考以下文章
RKObjectMapping 和 RKEntityMapping 的关系
我可以混合使用 RKEntityMapping 和 RKObjectMapping