【问题标题】:RestKit Nested Object of Same Type -- JSON Collection Error相同类型的 RestKit 嵌套对象——JSON 集合错误
【发布时间】: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


    【解决方案1】:

    看起来你的问题只是这一部分:

    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"comments.comments"
    

    因为从键路径应该只是@"comments"。您无需深入了解结构,RestKit 会在导航应用映射的 JSON 时为您完成。

    【讨论】:

    • 我知道有一次我只是在“cmets”上拥有它,但这一定是与其他一些(不正确的)组合。谢谢,多么简单的解决方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多