0

私が遭遇した2つのJSON形式があります:

フォーマット A:

[
  {"topic":
    {"category":"testCategory","created_at":"2011-09-27T05:41:42Z",
     "size":5,"title":"testTitle2", "id":1,
     "posts":[
               {"number":1,"created_at":"2011-09-27T05:41:42Z",
                "text":"text2","id":1,"topic_id":1},
               {"number":0,"created_at":"2011-09-27T05:41:42Z",
                "text":"sentence1","id":2,"story_id":1}
             ]
     }
  }
]

フォーマット B:

[
    {"category":"testCategory","created_at":"2011-09-27T05:41:42Z",
     "size":5,"title":"testTitle2", "id":1,
     "posts":[
               {"number":1,"created_at":"2011-09-27T05:41:42Z",
                "text":"text2","id":1,"topic_id":1},
               {"number":0,"created_at":"2011-09-27T05:41:42Z",
                "text":"sentence1","id":2,"story_id":1}
             ]
     }
]

私のrestKitクライアントがフォーマットBを取得すると、彼女は喜んでいますが、フォーマットAを取得すると、次のエラーが発生します:

 ... Could not find an object mapping for keyPath: '' ...

私のrestKit構成は一番下にあります。

そこで、Rails 3.1サーバーにフォーマットBのJSONを送信させることで修正しました。

しかし今、restKit はサーバーに形式 A JSON を送信し、彼は本来あるべき姿であるはずです。

restKit がフォーマット A を受信せず、フォーマット A を送信するのはなぜですか? restKit にフォーマット B JSON を送信させる方法はありますか? または、Rails にフォーマット B を送信させ、フォーマット A を受信させる方法はありますか?

私のrestKit構成:

-(void)initRestKit{
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:3000/"];

objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"WTF.sqlite"];

// Setup our object mappings
RKManagedObjectMapping* topicMapping = [RKManagedObjectMapping mappingForClass:[Topic class]];
storyMapping.primaryKeyAttribute = @"topicID";
storyMapping.setDefaultValueForMissingAttributes = YES;
[storyMapping mapKeyPathsToAttributes:
 @"id", @"topicID",
 ....
 @"created_at", @"dateCreated", nil];

RKManagedObjectMapping* postMapping = [RKManagedObjectMapping mappingForClass:[Post class]];
sentencesMapping.primaryKeyAttribute = @"postID";
[sentencesMapping mapKeyPathsToAttributes:
 @"id", @"postID",
 ...
 @"text", @"text" , nil];

//setup relationships
[storyMapping mapRelationship:@"posts" withMapping:postMapping];//topic -> (posts) -> post

// Register our mappings with the provider
[objectManager.mappingProvider setMapping:topicMapping forKeyPath:@"topic"];
[objectManager.mappingProvider setMapping:postMapping forKeyPath:@"post"];

// Set Up Router
[objectManager.router routeClass:[Topic class] toResourcePath:@"/topics.json" forMethod:RKRequestMethodPOST];
[objectManager.router routeClass:[Topic class] toResourcePath:@"/topics/(topicID).json"];
[objectManager.router routeClass:[Post class] toResourcePath:@"/topics/(topic.topicID)/posts.json" forMethod:RKRequestMethodPOST];
[objectManager.router routeClass:[Post class] toResourcePath:@"/topics/(topic.topicID)/(post.postID).json"];    
}

-(void)sendTopic{
    RKObjectManager *manager =[RKObjectManager sharedManager];
    [manager postObject:self.topic delegate:nil block:^(RKObjectLoader *loader) { 
        RKObjectMapping* sendTopicMapping = [RKManagedObjectMapping mappingForClass:[Topic class]];
        [sendTopicMapping mapKeyPathsToAttributes:
         @"id", @"topicID",
         ....
         @"title", @"title", nil];

        RKManagedObjectMapping* postPostMapping = [RKManagedObjectMapping mappingForClass:[Post class]];
        [postPostMapping mapKeyPathsToAttributes:
         @"id", @"postID",
          ....
         @"text", @"text" , nil];

        [sendTopicMapping mapRelationship:@"posts" withMapping:postPostMapping];
        [manager.mappingProvider setMapping:sendTopicMapping forKeyPath:@"topic"];

        loader.serializationMapping = [sendTopicMapping inverseMapping];
    }];
 }
4

2 に答える 2

2

プロセスの両端を制御しているように見えるため、送信される内容も制御できます。あなたが提供する 2 つの JSON スニペットは、実際には 2 つの異なるデータ構造です。(A) は、それぞれが多数のメンバー要素を含む 2 つのオブジェクトを含む配列です。(B) は、「患者」キーと、多数の異なるキー/値ペアを含む別のオブジェクトである値を持つ 2 つのオブジェクトを含む配列です。

たとえば、あなたのシステムは 2 つの異なるデータ構造を生成しており、あなたのサービスはそれらの構造の 1 つだけを期待しています。そして、適切なデータが含まれているように見えても、「悪い」構造を処理する方法がわかりません。

于 2011-09-26T21:53:41.573 に答える
1

誰かが興味を持っているなら、私はそれを解決しました:

Railsでは、次のようにrestKitクライアントのネストされたjson(フォーマットA)を送信するようにモデルを変更しました:

class Topic < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts
  self.include_root_in_json = true 
end

post メソッドの属性を次のようにネストしました。

-(void)sendTopic{
    RKObjectManager *manager =[RKObjectManager sharedManager];
    [manager postObject:self.topic delegate:nil block:^(RKObjectLoader *loader) { 
    RKObjectMapping* sendTopicMapping = [RKManagedObjectMapping mappingForClass:[Topic class]];
    [sendTopicMapping mapKeyPathsToAttributes:
     @"topic[id]", @"topicID",
     ....
     @"topic[title]", @"title", nil];

    RKManagedObjectMapping* postPostMapping = [RKManagedObjectMapping mappingForClass:[Post class]];
    [postPostMapping mapKeyPathsToAttributes:
     @"post[id]", @"postID",
      ....
     @"post[text]", @"text" , nil];

    [sendTopicMapping mapRelationship:@"posts" withMapping:postPostMapping];
    [manager.mappingProvider setMapping:sendTopicMapping forKeyPath:@"topic"];

    loader.serializationMapping = [sendTopicMapping inverseMapping];
    }];
}
于 2011-09-27T09:29:07.803 に答える