вложенный json с restkit на iphone

#iphone #objective-c #restkit

#iPhone #objective-c #restkit

Вопрос:

на данный момент просто пытаюсь привыкнуть к приложениям restkit для 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=36995582amp;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
  

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

Ответ №1:

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

Вместо этого ваш класс Numbers должен быть просто Number, и вы должны синтезировать свою переменную number следующим образом @synthesize number = _number; . Итак, ваш Number.m должен выглядеть как

 @implementation Number
@synthesize number = _number;

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

Поскольку вашим свойством является number, значение словаря сопоставления равно @"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=36995582amp;planner=insta-grammar" delegate:self];
  

Полный пример смотрите в Примере каталога в проекте RestKit на github

Комментарии:

1. Нет, он все еще не работает. на самом деле класс number даже никогда не вызывается. я попробовал пример catalog и использовал его классы вместо своих и назвал их так же, как в примере, и все еще без радости. он по-прежнему загружается только в виде данных, отличных от массива.

Ответ №2:

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

Комментарии:

1. На мой взгляд, я думаю, вам следовало принять ответ бенснайдера, а не свой собственный, поскольку он ответил на ваш конкретный вопрос. Верно, OM2 — лучший способ, но его ответ касался обстоятельств, представленных в вашем вопросе.

2. я понимаю вашу точку зрения, но я попробовал это так, как сказал бенснайдер, и у меня все равно ничего не получилось. ответ, который он дал, возможно, был на 100% правильным, но если у меня это не сработало, я не вижу, как я могу проголосовать за это как за правильное, извините.