1

现在只是想习惯这里的 iphone 应用程序的 restkit,我碰壁了。我试图从嵌套的 json 文件中获取数据。

[
{"person": {
    "name": "joe",
    "id": "1234",
    "numbers":
        [
            {"value": "555-12125"},
            {"value": "222-12125"}
        ]
    }
}]

我像这样设置了rkobjectmanager

RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:3000"];  
[manager loadObjectsAtResourcePath:@"/J.json?user_id=36995582&planner=insta-grammar" objectClass:[Person class] delegate:self] ;

[manager registerClass:[Person class] forElementNamed:@"person"];
[manager registerClass:[Numbers class] forElementNamed:@"numbers"];

那么person类和numbers类如下

#import "Person.h"


@implementation Person

@synthesize _name,_id,_number;

+ (NSDictionary*)elementToPropertyMappings {  
    return [NSDictionary dictionaryWithKeysAndObjects:  
            @"name",@"name",
            @"id",@"id",nil];  
}  




+ (NSDictionary*)elementToRelationshipMappings {
    return [NSDictionary dictionaryWithKeysAndObjects:
            @"numbers", @"numbers",
            nil];
}

@end


#import "Numbers.h"


@implementation Numbers

@synthesize _number;

+ (NSDictionary*)elementToPropertyMappings {  
    return [NSDictionary dictionaryWithKeysAndObjects:  
            @"value",@"value",nil];  
}  

+ (NSString*)primaryKeyProperty {
    return @"value";
}
+ (NSDictionary*)relationshipToPrimaryKeyPropertyMappings {
    return [NSDictionary dictionaryWithObject:@"value" forKey:@"value"];
}



@end

但是每次在调用 didloadobjects 函数后 _number 仍然为空,而 name 和 id 变量填充得很好。对此有什么想法吗?我在 git 上尝试了该示例,但无法使其正常工作,因此将不胜感激。谢谢克

4

2 回答 2

3

您需要做的是NSArray *_numbers在 Person.h 中声明一个成员变量,使其成为属性 like@property (nonatomic, retain) NSArray *_numbers并在 Person.m like 中合成它@synthesize numbers = _numbers。然后你可以摆脱 _number 是什么,因为你不会存储单个数字对象,你将存储一个数字对象数组。

你的 Numbers 类应该只是 Number,你应该合成你的 number 变量,比如@synthesize number = _number;. 所以你的 Number.m 应该看起来像

@implementation Number
@synthesize number = _number;

+ (NSDictionary *)elementToPropertyMappings {  
    return [NSDictionary dictionaryWithKeysAndObjects:  
            @"value", @"number", nil];  
}

因为您的属性是数字,所以映射字典值是@"number",而您的源 JSON 键应该是@"value"

然后你可以像这样加载对象(注意我们使用我们的Number类作为@"numbers"元素):

RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:3000"];
[manager registerClass:[Person class] forElementNamed:@"person"];
[manager registerClass:[Number class] forElementNamed:@"numbers"];

[manager loadObjectsAtResourcePath:@"/J.json?user_id=36995582&planner=insta-grammar" delegate:self];

有关完整示例,请参阅RestKit github 项目中的目录示例

于 2011-06-01T14:54:11.090 回答
0

仅适用于任何跟进此问题的人。终于使用他们刚刚与restkit一起发布的新OM2来完成这一切。非常好用且易于使用的更改

于 2011-06-09T12:45:58.120 回答