【发布时间】:2014-04-10 00:34:00
【问题描述】:
我正在使用 RestKit 拉入可能有子 cmets 的 cmets(这些孩子可能有孩子等)。
我能够毫无问题地深入 0 cmets。对于每个深度 0 评论,我都有一组评论对象。每个父评论都填充了正确数量的子 cmets,但子内的所有属性都是 nil(只有深度 0 的父级填充了真实数据)。 RestKit 给了我警告:
W restkit.object_mapping:RKMappingOperation.m:645 警告:检测到包含另一个集合的集合的关系映射。这可能不是你想要的。考虑使用 KVC 集合运算符(例如 @unionOfArrays)来展平您的可映射集合。
W restkit.object_mapping:RKMappingOperation.m:646 关键路径“cmets.cmets”产生的集合包含另一个集合而不是对象集合:
此外,对于我尝试在孩子中映射的每个属性,我都会收到此消息(按属性类型更改)
E restkit.object_mapping:RKMappingOperation.m:440 将 keyPath 'vote_count' 处的值转换为 'NSNumber' 类型的表示失败:错误域 = org.restkit.RKValueTransformers.ErrorDomain 代码 = 3002“值转换失败”( )' 到 NSNumber:咨询的 2 个值转换器都没有成功。" UserInfo=0x8e68280 {detailedErrors=( "Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 \"给定的值还不是'NSNumber'的实例\" UserInfo=0x8e681e0 {NSLocalizedDescription=给定的值还不是'NSNumber'的实例}" , "Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3000 \"期望
inputValue类型为NSNull,但得到__NSArrayI。\" UserInfo=0x8e68210 {NSLocalizedDescription=期望inputValue类型为@ 987654326@, 但得到了__NSArrayI.}"), NSLocalizedDescription=值转换失败'( )' 到 NSNumber:所咨询的 2 个值转换器都没有成功。}
尽管有警告,但我相信这是我想要的——但它在映射子对象时遇到了困难。它在期望属性类型时抱怨它“得到了一个 NSArray”,所以我认为我的属性映射不正确。
这是我的映射:
+ (RKMapping *) dnCommentMapping {
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[DNComment class]];
[mapping addAttributeMappingsFromDictionary:@{
@"id": @"commentId",
@"body": @"body",
@"body_html": @"bodyHTML",
@"created_at": @"createdAt",
@"depth": @"depth",
@"vote_count": @"voteCount",
@"user_id": @"userID",
@"user_display_name": @"userDisplayName",
}];
[mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"comments.comments"
toKeyPath:@"comments"
withMapping:mapping]];
return mapping;
}
这是我的对象
@interface DNComment : NSObject
@property (nonatomic, assign) NSInteger commentId;
@property (nonatomic, copy) NSString *body;
@property (nonatomic, copy) NSString *bodyHTML;
@property (nonatomic, copy) NSDate *created_at;
@property (nonatomic, assign) NSInteger depth;
@property (nonatomic, assign) NSInteger voteCount;
@property (nonatomic, copy) NSDate *createdAt;
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, copy) NSString *userDisplayName;
@property (nonatomic, strong) NSArray *comments;
@end
我的 RKResponseDescriptor
RKMapping *mapping = [DNAMappingProvidor dnCommentMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
method:RKRequestMethodGET
pathPattern:/api/v1/stories/1
keyPath:@"story.comments"
statusCodes:statusCodeSet];
您可以在图像中看到深度 0 评论已填充,它创建了正确数量的子项(并且他们的子项计数是正确的),但未填充它们。
这是我尝试映射的 JSON 示例
{
"story": {
"badge": "discussion",
"comment": "THE STORY",
"comments": [
{
"body": "THIS IS MY COMMENT - I GET MAPPED FINE",
"body_html": "<p>THIS IS MY COMMENT - I GET MAPPED FINE</p>\n",
"comments": [
{
"body": "THIS IS MY CHILD RESPONSE - NONE OF MY PROPERTIES GET SET",
"body_html": "<p>THIS IS MY CHILD RESPONSE - NONE OF MY PROPERTIES GET SET</p>\n",
"comments": [
{
"body": "THIS IS MY CHILD'S CHILD RESPONSE - NONE OF MY PROPERTIES GET SET",
"body_html": "<p>THIS IS MY CHILD'S CHILD RESPONSE - NONE OF MY PROPERTIES GET SET </p>\n",
"comments": [
],
"created_at": "2014-02-17T21:07:13Z",
"depth": 2,
"id": 41665,
"url": "https://www.www.com",
"user_display_name": "A M.",
"user_id": 201,
"user_job": "Job Title",
"user_portrait_url": "image.png",
"user_url": "user.com",
"vote_count": 1
}
],
"created_at": "2014-02-17T20:50:05Z",
"depth": 1,
"id": 41655,
"url": "https://www.www.com",
"user_display_name": "M K.",
"user_id": 3517,
"user_job": "Job Title",
"user_portrait_url": "image.png",
"user_url": "user.com",
"vote_count": 2
}
],
"created_at": "2014-02-17T20:14:47Z",
"depth": 0,
"id": 41649,
"url": "www.www.com",
"user_display_name": "A M.",
"user_id": 201,
"user_job": "Job Title",
"user_portrait_url": "image.com",
"user_url": "user.com",
"vote_count": 32
},
谢谢
【问题讨论】:
标签: ios objective-c json restkit