2011-09-26 45 views
0

有我来跨越两个JSON格式:JSON格式不一致

格式答:

[ 
    {"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? 或者,也许有办法让钢轨发送格式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]; 
    }]; 
} 
+0

a和b在语义上有所不同 –

回答

1

我解决它,如果有人有兴趣:

在铁轨我改变了MODLE所以它会发送restKit客户嵌套JSON(格式A)是这样的:

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

我发的帖子方法属性如下嵌套:

-(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]; 
    }]; 
} 
2

因为你似乎控制过程的两端,你也有什么获取sents控制。您提供的两个JSON片段实际上是两个不同的数据结构。 (A)是一个包含两个对象的数组,每个对象包含多个成员元素。 (B)是一个数组,其中包含两个具有“患者”键的对象和一个包含多个不同键/值对的另一个对象的值。

例如您的系统正在生成两种不同的数据结构,并且您的服务只期望其中的一种结构 - 并且正确地不知道如何处理“错误”结构,即使它看起来包含正确的数据。

+1

它是如何回答的? –

+0

怎么样?它说'你必须修复服务器代码才能发送正确的JSON - 有时候并不是一个'':) –