2012-03-16 39 views
4

私はJSONを非常にうまく解析していましたが、私のサーバーはちょうど私に変わってしまいました。私のJSONは、このように見えるように使用:RestKit複雑なオブジェクトの配列を使ったマッピング

{ 
    "blobs": [ 
     { 
      "createdOn": "2012-03-16T15:13:12.551Z", 
      "description": "Fake description", 
      "hint": "And a useless hint", 
      "id": 400, 
      "name": "Fake CA one", 
      "publicId": "FF6", 
      "type": 0 
     }, 
     { 
      "createdOn": "2012-03-16T17:33:48.514Z", 
      "description": "No hint on this one, but it does have a description.", 
      "hint": "Hint", 
      "id": 402, 
      "name": "Second fake one in CA", 
      "publicId": "FF8", 
      "type": 0 
     } 
    ] 
} 

と私のマッピングは、このように見えた。だから私は追加

{ 
    "blobsList": { 
     "blobs": [ 
      { 
       "createdOn" :"2012-03-16T15:13:12.551Z", 
       "description": "Fake description", 
       "hint": "And a useless hint", 
       "id": 400, 
       "name": "Fake CA one", 
       "publicId": "FF6", 
       "type": 0 
      }, 
      { 
       "createdOn": "2012-03-16T17:33:48.514Z", 
       "description": "No hint on this one, but it does have a description.", 
       "hint": "Hint", 
       "id": 402, 
       "name": "Second fake one in CA", 
       "publicId": "FF8", 
       "type": 0 
      } 
     ] 
    } 
} 

RKObjectMapping* blobMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponse class]]; 

[blobMapping mapKeyPath:@"name" toAttribute:@"name"]; 
[blobMapping mapKeyPath:@"id" toAttribute:@"blobId"]; 
[blobMapping mapKeyPath:@"description" toAttribute:@"description"]; 
[blobMapping mapKeyPath:@"hint" toAttribute:@"hint"]; 

[[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobs"]; 

今、私のサーバーが変更されたと、私はこれを取り戻しますこれは私のマッピングに:

RKObjectMapping* blobsListMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponseList class]]; 
[blobsListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"]; 

[[RKObjectManager sharedManager].mappingProvider setMapping:blobsListMapping forKeyPath:@"blobsList"]; 

とされているが、私のクラスです:私はこのJSONをパースするとき

@interface GetResponseInRegionResponse : NSObject 
{ 
    NSString* name; 
    NSString* blobId; 
    NSString* description; 
    NSString* hint; 
}  

@interface GetResponseInRegionResponseList : NSObject 
{ 
    NSArray *blobsList; 
} 

は、私はそれらの両方がJKDictionaryオブジェクトで、その中の2つのオブジェクトのJKArrayを持っている一つのオブジェクトを取得します。明らかにそれは私のデータですが、JKDictionary形式です。それはGetResponseInRegionResponseクラスに決してマップされませんでした!

githubドキュメントを読むことで、配列のtoRelationshipメソッドを使用したいと思うようですが、どこに配置するのか分かりません。私は「記事」の例に従うと、これをしようとした場合:

[blobListMapping mapKeyPath:@"blobs" toAttribute:@"blobsList"]; 
[blobListMapping mapKeyPath:@"blobs" toRelationship:@"blobsList" withMapping:blobMapping]; 

を、私はこの例外を取得:

2012-03-19 14:59:53.704 Ferret[8933:16303] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to add mapping for keyPath blobsList, one already exists...' 

それでは、どのように私は私のJSON内の複雑なオブジェクトの配列をマッピングすることができますか?

何か助けていただきありがとうございます。ありがとう!

答えて

2

は、あなただけのデータ配列に変更されたパスを反映する

[[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobsList.blobs"]; 

を変更しようとしたことがありますか?

+0

を、私は私が得ることを行うと:. - ***キャッチされていない例外 'NSUnknownKeyException'、理由: '[ valueForUndefinedKey:]:このクラスはキーIDに対応するキー値ではありません。 –

+0

ああ、それは私の間違いでした。JSONには "id"というタグが付けられていて、 "id"ではなく "blobId"という名前のクラスメンバーがありました。しかし、私もtoRelationshipの部分を持っていなければなりませんでした。私はRestKitのメーリングリストを外しました。その人が問題のその部分でここにチャインムするなら、私はあなたの2人の間で恩恵を分けることができるかどうかを見ます。どうもありがとうございます! –

+0

あなたのJSONの設定方法はあなたの関係を必要としません。 _object_ "blobsList"の中には、別の_object_ "blobs"が直接存在し、そこには配列しかありません。 "blobList"は実際にあなたの例に似ていれば決して配列を含むことはありません。 – k1th

3

受け入れられた回答は、v0.2より前のバージョン、現在のバージョンに対応するようです。私のソリューションは、コードを以下に貼り付けられ、わずかに異なるなります

RKObjectMapping * eventMapping = [RKObjectMapping mappingForClass:[RKJMEvent class]]; 
[eventMapping addAttributeMappingsFromDictionary:[RKJMEvent map]]; 
RKObjectMapping * eventResponseMapping =[RKObjectMapping mappingForClass:[RKJMEventsResponse class]]; 
[eventResponseMapping addAttributeMappingsFromDictionary:[RKJMEventsResponse map]]; 
[eventResponseMapping addRelationshipMappingWithSourceKeyPath:@"events" mapping:eventMapping]; 


RKResponseDescriptor *responseDescriptorEventResponse = [RKResponseDescriptor responseDescriptorWithMapping:eventResponseMapping 
                        pathPattern:API_GET_EVENTS_PATH 
                         keyPath:nil 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:responseDescriptorEventResponse]; 
+0

おかげで、それはむしろ「イベント」よりご質問から、クラス名、およびキーのパスを使用する場合には、より明確になり、など – murrayc

+0

@murrayc私の2歳の答えを編集して自由料あなたは、あなたがそれを作ることができると思われる場合より有用! – deepwinter

関連する問題