вложенный json с ресткитом на iphone

просто пытаюсь привыкнуть к ресткиту для приложений для iphone здесь в данный момент, и я врезался в стену. Я пытаюсь получить данные из вложенного файла 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"];

тогда класс человека и класс чисел следующим образом

#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

но каждый раз, когда _number остается пустым после вызова функции didloadobjects, в то время как переменные name и id заполняются нормально. любые идеи по этому поводу?. Я попробовал пример на git, но не смог заставить его работать, поэтому любая помощь будет оценена по достоинству. спасибо г


person glogic    schedule 01.06.2011    source источник


Ответы (2)


Что вам нужно сделать, так это объявить переменную-член NSArray *_numbers в Person.h, сделать ее свойством, например @property (nonatomic, retain) NSArray *_numbers, и синтезировать ее в Person.m, например @synthesize numbers = _numbers. Затем вы можете избавиться от любого _number, поскольку вы не будете хранить один числовой объект, вы будете хранить массив числовых объектов.

Вместо этого ваш класс Numbers должен быть просто 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. гитхаб проект

person bensnider    schedule 01.06.2011
comment
Нет, все еще не работает. на самом деле класс номеров никогда даже не вызывается. я пробовал пример каталога и использовал его классы вместо моих и называл их так же, как в примере, и все равно не радуюсь. он по-прежнему загружает только данные без массива. - person glogic; 02.06.2011

Просто для тех, кто следит за этим. Наконец-то все это заработало, используя новый OM2, который они только что выпустили с ресткитом. очень красивое и простое в использовании изменение

person glogic    schedule 09.06.2011
comment
На мой взгляд, я думаю, вы должны были принять ответ Беннайдера, а не свой собственный, поскольку он ответил на ваш конкретный вопрос. Правда, OM2 - лучший способ, но его ответ касался обстоятельств, представленных в вашем вопросе. - person Michael Morrison; 13.06.2011
comment
Я понимаю вашу точку зрения, но я попробовал, как сказал Беннидер, и это все еще не сработало для меня. ответ, который он дал, возможно, был на 100% правильным, но если он не сработал для меня, я не понимаю, как я могу проголосовать за него как за правильный, извините. - person glogic; 13.06.2011