2011-09-26 3 views
0

내가 건너 온이 JSON 형식이 있습니다는 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 : 내 restKit 클라이언트가 형식 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} 
      ] 
    } 
] 

그녀는 기쁘게 하지만 그녀가 포맷 A를 얻었을 때 다음과 같은 오류가 발생합니다 :

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

내 restKit 구성이 맨 아래에 있습니다.

그래서 난 레일 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

나는 그것을 해결

-(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)는 '환자'키와 다양한 키/값 쌍을 포함하는 다른 객체 인 값을 갖는 두 객체를 포함하는 배열입니다.

귀하의 시스템은 두 개의 서로 다른 데이터 구조를 생성하고 있으며 귀하의 서비스는 그러한 구조 중 하나만을 기대하고 있습니다. 올바른 데이터가 포함 된 것으로 보일지라도 '나쁜'데이터를 처리하는 방법을 알지 못합니다. 그것은이 같은 restKit 클라이언트 중첩 된 JSON (포맷 A) 보낼 수 있도록 레일

내가 modle을 변경 :

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

을 나는 포스트 방법을 만든 사람이 관심이 있다면

+1

어떻게 대답입니까? –

+0

어때? 그것은 '정확한 JSON을 보내기 위해 서버 코드를 고쳐야 만합니다 - 때로는 다른 것은 아닙니다'라고 말합니다. :) –