Я полагаю, что вы пропускаете один «уровень» своего отображения.Если вы внимательно присмотритесь к своему вводу, у вас есть словарь (key1), содержимое которого - не один 'Sendung
', а массив таких объектов.Таким образом, вы не можете отобразить содержимое ключа key непосредственно на Sendung
ivars, а не создать новый класс, например SendungResult
.
@interface SendungResult : NSObject
@property (nonatomic, strong) NSString *keyName;
@property (nonatomic, strong) NSArray *sendungs;
@end
, и сопоставить содержимое ключа key1 с SendungResult
sendungs
массив с использованием сопоставления отношений, которое вы используете прямо сейчас.
РЕДАКТИРОВАТЬ: Я расширяю ответ следующим образом:
Как я уже говорил ранее, вы пытаетесь сопоставитьколлекция объектов в одном экземпляре, так что это не может работать.Вместо этого вам нужно создать SendungResult
, который будет содержать массив Sendung
экземпляров для одного ключа.Таким образом, в вашем примере вы получите два SendungResult
экземпляра (один будет содержать три Sendung
s - вложенные в "key1"
, а второй - только два, вложенные в "key2"
).Вы не можете отобразить такую структуру в один класс, вы должны вложить их так же, как вложенный JSON.Класс Sendung
в основном не изменился.
Теперь для отображения.Вам необходимо определить два сопоставления, одно сопоставит содержимое вашего корневого JSON с двумя SendungResult
(по одному для каждого ключа), а второе сопоставление будет сопоставлять внутреннюю часть с отдельными Sendung
экземплярами.
Мыначнем с внутреннего сопоставления.
RKObjectMapping *sendungMapping = [RKObjectMapping mappingForClass:[Sendung class]];
[sendungMapping mapKeyPath:@"desc" toAttribute:@"desc"];
[sendungMapping mapKeyPath:@"duration" toAttribute:@"duration"];
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:sendungMapping];
Ничего особенного здесь нет, мы просто сопоставим траектории клавиш с вашими свойствами.Теперь для внешней части.
RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[SendungResult class]];
[resultMapping setForceCollectionMapping:YES];
[resultMapping mapKeyOfNestedDictionaryToAttribute:@"keyName"];
[resultMapping mapKeyPath:@"(keyName)" toRelationship:@"sendungs" withMapping:sendungMapping];
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:resultMapping];
Мы сообщаем RestKit сопоставить содержимое keyName keyPath со свойством sendungs
, найденным в классе SendungResult
, с отображением, определенным ранее.
Теперь мыможет извлекать данные
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self];
RestKit создаст два SendungResult
экземпляра, каждый массив содержит внутренние Sendung
классы (3 и 2 соответственно)
Примечание: Я настоятельно рекомендую вам прочитать RestKit Object Mapping документацию.Кроме того, JSONLint обнаружил, что ваш JSON является недействительным, мне пришлось удалить точку с запятой.Поэтому обязательно используйте действительный JSON.