2013-07-01 7 views
0

Я пытаюсь разобрать ответ json для использования с базовой моделью данных. Это пример из JSON:RestKit, создающий несколько для многих отношений

{ 
     "@context": "TVSchedule", 
     "ReturnCode": "0", 
     "ReturnMessage": "Successful request", 
     "Channel": [ 
     { 
      "ChannelId": "http%…..0", 
      "Program": [ 
      { 
       "@programId": "http……..", 
       "Title": "Divorce Court", 
       "ProgramLogo": "http://00_180x101.png", 
       "ProgramLogos": [ 
       { 
        "@size": "small", 
        "#text": "http://.png" 
       }, 
       { 
        "@size": "large", 
        "#text": "191.png" 
       } 
       ], 
       "ProgramDetailsURL": "http:9", 
       "PublishedStartTime": "2013-07-01T19:00:00", 
       "PublishedEndTime": "2013-07-01T19:30:00", 
       "Duration": "00:00:30:00", 
       "RatingInfo": { 
       "@system": "MPAA", 
       "@code": "TV-PG", 
       "@age": "10", 
       "Title": "Not recommended for children under 10 years", 
       "Logo": "http://" 
       }, 
       "ShortDescription": "She says she cannot trust him .", 
       "Year": "2013", 
       "Genres": [ 
       "Series", 
       "Reality", 
       "Public Affairs", 
       "News", 
       "Episodic" 
       ] 
      }, 

Мне нужно, чтобы получить это в CoreData, где у меня есть объект с именем канала, который будет содержать channelId отношения один-ко-многим с лица с именем программы, которая будет держать список атрибутов на этом уровне и будет иметь много отношений с объектами ProgramLogo (из «ProgramLogos» в json-файле) Жанры (массив строк жанров будет добавлен как число объектов Genre, которые содержат только один атрибут строки), Объект RatingsInfo (отношение один к одному из соответствующего словаря), RatingsInfo не отображается во всех программах ...

Вот код RestKit, который я использую:

RKEntityMapping *channelMapping = [RKEntityMapping mappingForEntityForName:kCDChannelEntity inManagedObjectStore:managedObjectStore]; 
    channelMapping.identificationAttributes = @[ kCDChannelId ]; 

    [channelMapping addAttributeMappingsFromDictionary:@{ 
             kJsonChannelId : kCDChannelId 
    }]; 



    RKEntityMapping *programMapping = [RKEntityMapping mappingForEntityForName:kCDProgramEntity inManagedObjectStore:managedObjectStore]; 


    [programMapping addAttributeMappingsFromDictionary:@{ 
             @"@programId" : kCDProgramId , 
            @"ProgramLogo" : kCDProgramLogo, 
           @"ProgramDetailsURL" : kCDProgramDetailsUrl, 
             @"Duration" : kCDProgramDuration, 
           @"PublishedStartTime" : kCDProgramStartTime, 
           @"PublishedEndTime" : kCDProgramEndTime, 
              @"Title" : kCDProgramTitle, 
              @"Year" : kCDProgramYear, 
           @"ShortDescription" : kCDProgramShortDescription 
    }]; 

    [RKObjectMapping addDefaultDateFormatterForString:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" inTimeZone:nil]; 

    [channelMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Program" toKeyPath:kCDChannelHasProgramsRel withMapping:programMapping]];// ?? 


    RKEntityMapping *parentalRatingMapping = [RKEntityMapping mappingForEntityForName:kCDParentalRatingEntity inManagedObjectStore:managedObjectStore]; 
    [parentalRatingMapping addAttributeMappingsFromDictionary:@{ 
              @"[email protected]": kCDParentalRatingAge, 
             @"[email protected]" : kCDParentalRatingCode, 
             @"Program.RatingsInfo.Logo" : kCDParentalRatingLogo, 
             @"[email protected]" : kCDParentalRatingSystem, 
             @"Program.RatingsInfo.Title" : kCDParentalRatingTitle}]; 

    [programMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Program.RatingsInfo" toKeyPath:kCDProgramHasParentalRatingRel withMapping:parentalRatingMapping]];// ?? 



    RKEntityMapping *genresMapping = [RKEntityMapping mappingForEntityForName:kCDGenreEntity inManagedObjectStore:managedObjectStore]; 
    [genresMapping addAttributeMappingsFromDictionary:@{ 
    @"Program.Genres": kCDGenreName 
    }]; 

    [programMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Program.Genres" toKeyPath:kCDProgramHasGenres withMapping:genresMapping]]; 


    RKEntityMapping *logoMapping = [RKEntityMapping mappingForEntityForName:kCDProgramLogoEntity inManagedObjectStore:managedObjectStore]; 
    [logoMapping addAttributeMappingsFromDictionary:@{ 
    @"[email protected]" : kCDLogoSize, 
    @"Program.ProgramLogos.#text" : kCDLogoText 
    }]; 

Хорошо, теперь есть две проблемы: 1) Как разобрать два не-Кво массивы (Жанры каждой строки в другой сущности, и ProgramLogos (каждый ДИКТ в сущности)

2) RestKit не анализирует programId (ключ «@programId») почему? «@» В ключе останавливает синтаксический анализ?

я

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFDictionary 0x958f980> valueForUndefinedKey:]: this class is not key value coding-compliant for the key programId.' 

ответ

0

Похоже, ваш channelResponseDescriptor должен иметь в @ Ключевой путь "Канал". Трудно сказать, что что-то еще не так из-за всех констант. Кажется, что только дескриптор верхнего уровня нуждается в дополнительной информации о том, где он должен применяться.


Как правило, вы создаете все ваши сопоставления для связи друг с другом. Основываясь на структуре вашего JSON, есть хороший шанс, что вам не нужно столько дескрипторов ответов, только верхний уровень для каналов, тогда все сопоставления используются для перехода вниз по структуре с использованием отношений.


Например, у вас есть JSON:

"Channel": [ 
    { 
     "ChannelId": "http%…..0", 
     "Program": [ 
     {... 

Вы могли бы иметь связь между каналом и программными элементами и соответствующим отношением между отображениями, так что, когда канал отображается он будет перемещаться в программный раздел JSON, отобразить программы и затем подключить объекты. Вы, кажется, есть это:

[channelMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:kJsonProgram toKeyPath:kCDChannelHasProgramsRel withMapping:programMapping]]; 

(который имеет опечатку в коде, как это должно быть применено к channelMapping, не programMapping)

Так programResponseDescriptor, вероятно, не требуется, и может просто причина ваши результаты сопоставления содержат повторяющиеся элементы.

+0

Вот что я тоже думаю ... Я не уверен в ключах ... как они созданы для вложенных объектов и отношений? – user426132

+0

Не могли бы вы привести пример, пожалуйста? – user426132

+0

Не нуждается ли какой-либо сущность в собственном дескрипторе ответа? – user426132

Смежные вопросы