【问题标题】:RestKit RKObjectMapping nested jsonRestKit RKObjectMapping 嵌套 json
【发布时间】:2012-04-16 00:43:53
【问题描述】:

如何使用 RestKit RKObjectMapping 映射下面的嵌套 json?我只需要映射“数据”。我下面的当前代码返回 (null) - 谢谢!

{

    "sucess": true,
    "error": {
        "code": "",
        "message": ""
    },
    "data": [
        {
            "id": 1,
            "name": "Salad",
            "description": "Salad Desc",
            "category_id": 1
        },
        {
            "id": 2,
            "name": "Soup",
            "description": "Soup Desc",
            "category_id": 1
        },
        {
            "id": 3,
            "name": "Wrap",
            "description": "Wrap Desc",
            "category_id": 1
        },
        {
            "id": 4,
            "name": "Appetizers",
            "description": "Appetizers Desc",
            "category_id": 1
        }
    ]

} 

@interface Subcategory : NSObject    
    @property (nonatomic, retain) NSNumber *subcategoryID;
    @property (nonatomic, retain) NSNumber *categoryID;
    @property (nonatomic, retain) NSString *name;
    @property (nonatomic, retain) NSString *description;
    @property (nonatomic, retain) NSString *thumbnail;
    @property (nonatomic, retain) NSArray *data;

视图控制器

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Subcategory class]];

RKObjectMapping* dataMapping = [RKObjectMapping mappingForClass:[Subcategory class]];
[dataMapping mapKeyPath:@"id" toAttribute:@"subcategoryID"];
[dataMapping mapKeyPath:@"category_id" toAttribute:@"categoryID"];
[dataMapping mapAttributes:@"name", @"description", nil];

[mapping mapKeyPath:@"data" toRelationship:@"data" withMapping:dataMapping];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[NSString stringWith

【问题讨论】:

  • 为了他人的利益,github.com/RestKit/RestKit/wiki/Object-mapping 是 RK 对象映射的一个很好的入门资源。
  • 快速提问,我不是 ObjC 专家,但有人告诉我 NSString 属性应该是“复制”而不是“保留”,但我看到很多开源项目中保留了 NSString 属性并在此处发帖 - @steamboy 在这种情况下使用“保留”是否有原因?

标签: objective-c ios restkit


【解决方案1】:

您缺少 rootKeyPath 并且还在提供程序中设置映射:

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Subcategory class]];    
RKObjectMapping* dataMapping = [RKObjectMapping mappingForClass:[Subcategory class]];
[dataMapping mapKeyPath:@"id" toAttribute:@"subcategoryID"];
[dataMapping mapKeyPath:@"category_id" toAttribute:@"categoryID"];
[dataMapping mapAttributes:@"name", @"description", nil];
dataMapping.rootKeyPath = @"data"; //this is what you were missing    
//get your  mapping provider (i'm not sure if you already have on declared)
[mappingProvider setObjectMapping:dataMapping forResourcePathPattern:@"/somepath/toservice/"];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/somepath/toservice/"];

这里有更多信息来回答您关于获取其他元素的问题(例如“错误”):

- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error {
    NSError *parseError = nil;
    id response = [objectLoader.response parsedBody:&parseError];
    DLog(@"response %@", response);    
    if (!parseError) {
        NSString *errorMessage = [[response valueForKey:@"error"] valueForKey:@"message"];     
        //do something with it    
    }
}

【讨论】:

  • 我添加了 dataMapping = @"data";我收到此错误“从 NSString 分配给 'RKObjectMapping *_strong' 的指针类型不兼容”
  • 很抱歉我的错字。你需要 dataMapping.rootKeyPath
  • 你测试了吗?我在自己的代码中做了类似的事情,所以我知道 rootKeyPath 有效。
  • 成功了!谢谢!顺便说一句,我将如何映射“成功”和“错误”?我需要添加它们以将它们添加到标题中,就像“数据”一样
  • 老实说,我不确定那个...我相信您确实会在 restkit 代表调用中得到完整的响应,因此您可以手动查看。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2014-03-19
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多