0

コア データ モデルで使用するために json 応答を解析しようとしています。これは json からのサンプルです:

  {
      "@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"
              ]
            },

ChannelId を保持する Channel という名前のエンティティがある CoreData でこれを取得する必要があります。これは、そのレベルで属性のリストを保持し、対多の関係を持つ program という名前のエンティティとの 1 対多の関係です。エンティティ ProgramLogo (json ファイルの「ProgramLogos」から) Genres (genres 文字列配列は、1 つの文字列属性のみを含む多数の Genre エンティティとして追加されます)、RatingsInfo エンティティ (対応する辞書からの 1 対 1 の関係)、 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:@{
                                           @"Program.RatingsInfo.@age": kCDParentalRatingAge,
                                         @"Program.RatingsInfo.@code" : kCDParentalRatingCode,
                                         @"Program.RatingsInfo.Logo" : kCDParentalRatingLogo,
                                       @"Program.RatingsInfo.@system" : 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:@{
     @"Program.ProgramLogos.@size" : kCDLogoSize,
     @"Program.ProgramLogos.#text" : kCDLogoText
     }];

さて、ここで 2 つの問題があります: 1) 2 つの非 KVO 配列 (ジャンル、異なるエンティティ内の各文字列、および 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.'
4

1 に答える 1