2012-03-05 15 views
0

私はAFNetworkingを使用していますが、JSON構造体をPOSTしようとしています。問題は、{"my_property":"my value"}の代わりに、{my_property:'my_value'}と書式設定していることです。私は引用符の最初のセットの損失はほとんどの場合OKですが、私は非JSONのシングルクォートで何をすべきか分かりませんし、それが知っているすべてで一重引用符を生成する理由についてはかなり混乱していますそれはNSDictionaryからJSONを作成しています。さらに、それは[Object] refsを含んでいます。ここで私はちょうど "{"を期待しています。これは、サーバが取得しているものです。AFNetworking不正な形式のJSONをPOSTしています - 単一引用符と[Object]の参照

... 
num_matches: 32, 
view_instance: properties_in_view: [Object], 
[ { view_instance_ctr: 0, view_id: '4e5bb37258200ed9aa000011' }, 
... 

ターゲットは、iOS 5.0であるので、私はは(私はまだこれを確認するために試していませんが)JSONを作成するために、NSJSONSerializationを使用していますを想定しています。私が送る辞書は、isValidJSONObjectを使ってJSONにバリデーションを行います。シリアライズされたバージョンをプリントアウトするとすばらしく見えます。

NSDictionary *params = myDictionaryThatValidatesToJSON; 
httpClient.parameterEncoding = AFJSONParameterEncoding; 
NSMutableURLRequest *request = [httpClient 
    requestWithMethod:@"POST" path:@"" parameters:params]; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[operation start]; 

私が欠けているbigDummy = NOフラグがあります願っています:コードの簡易版は次のようになります。

答えて

0

あなたの問題はサーバー側にあると思います。あなたの質問で引用されたデバッグは、サーバーが受け取った生のJSONテキストではありませんが、サーバー上の一部のコンポーネントが行ったことをいくつか再解釈しています。

+0

ある

//私は、これは、サーバー上で受信されているものであるかなり確信しています二重チェックします。 Firefox RESTプラグインを使用して同じJSONを正常に送信でき、実際にログに記録されたデータはすべて二重引用符で囲まれていることに注意してください。もう1つ注意してください:私は以前、サーバ上の他のPOST APIに他のデータを正常に送りましたが、大きな文字列で辞書を初期化していましたが、その二重引用符をエスケープしました。私はそれが何か違いがあるかどうかを見て、それがサーバーの問題ではないことを確かめるために今、それを試してみましょう。どうも。 – michael

+0

JSONシリアライザが本当に[オブジェクト]を生成している場合、辞書に異常なオブジェクトがある必要があります。 – JosephH

+1

AFNetworkingはよく理解できませんが、NSJSONSerializationが利用可能であれば使用します。私がこれを行う場合: NSData * jsonData = [NSJSONSerialization dataWithJSONObject:outDictオプション:NSJSONWritingPrettyPrintedエラー:&エラー]; NSString * jsonOut = [[NSString alloc] initWithData:jsonDataエンコーディング:NSUTF8StringEncoding]; 有効なJSONを生成します。私はプログラムでJSONを作成していますが、それはかなり簡単なので、私は何か変わったことを導入しているとは思わないでしょう。 – michael

0

マイケルは正しいです。データの彼のコードを使用することにより、私は、JSONパラメータでPOSTリクエストを実行するためにこれを使用しています:データ辞書は、あなたのパラメータ辞書

NSError *error = nil; 

    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dataDictionary options:NSJSONWritingPrettyPrinted error:&error]; 

    //NSString *jsonOut = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:webURL]]; 

    [httpClient setParameterEncoding:AFFormURLParameterEncoding]; 

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" 
                  path:@"Webservice URL" 
                 parameters:nil]; 

    NSMutableData *body = [NSMutableData data]; 

    [body appendData:jsonData]; 

    [request setHTTPBody:body]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"content-type"]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

     // Print the response body in text 

     NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); 


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     NSLog(@"Error: %@", error); 


    }]; 
    [operation start]; 
+1

これらのヘッダのいくつかを設定するのではなく、 'AFHTTPClient'の' setParameterEncoding'を使うこともできます。 –

+0

@KeithSmiley:そうです。 – Muzammil