2011-12-13 15 views
2

返されたオブジェクトを正しく動作させマッピングするGETメソッドがあります。今私はPOSTメソッドに取り組んでいます。私は具体的には、次の形式RestKitを使用してマルチレベルJSONをシリアル化する方法

{ 
     "name": "Test", 
     "version": "1", 
     "iconId": 1, 
     "runFrequency": 5, 
     "lastActionSummary": "Yesterday, 9:30am", 
     "description": "Test", 
     "id": 1, 
     "containers": [ 
      { 
        "id": 1, 
        "triggers": [ 
         { 
           "@class": "someClass", 
           "intValue": 90, 
           "operator": "equal", 
           "type": "Ttest" 
         } 
        ] 
      } 
     ] 
} 

私は、サーバーからの応答のためのオブジェクトのマッピングを行うようにそれを行う試した中で3つのレベルがあるが、それは事実に起因して失敗した、マルチレベルJSONをシリアライズする必要があり、そのコンテナは決してJSONに追加されます。どのように私はこれを達成するための任意のアイデアですか? Restkitの例では、複数レベルのJSONが表示されないので、大いに役立ちました。

答えて

2

あなたがここに欲しいことは、様々な分野を含む辞書であるように思える。そして、

NSMutableDictionary *topDictionary = [[NSMutableDictionary alloc] init]; 
[topDictionary setObject:@"Test" forKey:@"name"]; 
[topDictionary setObject:@"1" forKey:@"version"]; 
... 

、あなたは各配列項目内の辞書とコンテナの配列を持っている:

NSMutableArray *containers = [[NSMutableArray alloc] init]; 
[topDictionary setObject:containers forKey:@"containers"]; 
NSMutableArray *arrayItem1 = [[NSMutableDictionary alloc] init]; 
[containers addObject:arrayItem1]; 
[arrayItem1 setObject:[NSNumber numberWithInteger:1] forKey:@"id"]; 
... 

各以内コンテナの下にある辞書のうち、配列の各項目がディクショナリであるトリガ配列があります。

これはちょうどそのコンテナに1つのトリガーを入れて1つのコンテナを追加する方法を示しています。各配列に複数の項目を配置する場合は、適切なループに変換します。

辞書(配列内、辞書内、配列内、辞書内)を取得すると、JSONにきれいにシリアル化できるオブジェクトが作成されます。

+0

おかげで、私はこの –

+0

グレートこれはそんなに助けしようとします。また、明確な答えをありがとう –

0

入れ子になっている辞書を作成する方法については、まさに正しいです。ここで全部を取り、それをJSONのポストを作成する方法は次のとおりです。

// create a JSON string from your NSDictionary 
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:topDictionary 
                options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string 
                error:&error]; 
NSString *jsonString = [[NSString alloc] init]; 
if (!jsonData) { 
    NSLog(@"Got an error: %@", error); 
} else { 
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
} 

// make the post using the objectManager if you want to map the response to a model 
RKObjectManager* objectManager = [RKObjectManager sharedManager]; 
[objectManager loadObjectsAtResourcePath:@"/api/" delegate:self block:^(RKObjectLoader* loader) { 
    loader.serializationMIMEType = RKMIMETypeJSON; // We want to send this request as JSON 
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Plan class]]; 
    loader.resourcePath = @"/api/"; 
    loader.method = RKRequestMethodPOST; 
    loader.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON]; 
}]; 
0

過去Flaviuの答えを超えるだけのシンプルなショートカット。

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) { 
    ... 
    [loader setBody:topDictionary forMIMEType:RKMIMETypeJSON]; 
    ... 
}]; 

あなたはRKRequestヘッダファイル(RKRequest.h)を見てより多くの情報を見つけることができます:あなたは、リクエストボディJSONペイロードとして作成された辞書を送信したい場合は、単に次のコマンドを使用します。

- (void)setBody:(NSDictionary *)body forMIMEType:(NSString *)MIMEType; 

はすべて私の最高の

関連する問題