1

EDIT 2:辞書キーの「_」と「/」が問題だとは思わなくなりました。

編集 3: もう JSON や HTTP POST リクエストに問題があるとは思いません。それが何であるかはまだ正確にはわかりません。

編集4:解決しました。データ要素は有​​効な base64 である必要がありました。そうでない場合、couch はそれを拒否します。それは知りませんでした。自分の答えをまだ選択できません。

JSON 文字列に変換したい辞書があります。これは私の辞書の設定です:

- (NSDictionary*) createDictionary
{
    NSMutableDictionary *room = [[NSMutableDictionary alloc] init];

    [room setObject:self.roomNumber forKey:@"roomNumber"];
    [room setObject:self.floor forKey:@"floor"];
    [room setObject:self.comment forKey:@"comment"];
    [room setObject:self.type forKey:@"type"];
    [room setObject:[NSNumber numberWithInt:self.status] forKey:@"status"];
    [room setObject:[[NSMutableDictionary alloc] init] forKey:@"_attachments"];

    NSMutableDictionary *attachments = [room objectForKey:[NSString stringWithFormat:@"_%@", @"attachments"]];
    [attachments setObject:[[NSMutableDictionary alloc] init] forKey:@"picture"];

    NSMutableDictionary *picture = [attachments objectForKey:@"picture"];
    [picture setObject:@"text/plain" forKey:@"content_type"];
    [picture setObject:@"BASE64" forKey:@"data"];

    NSLog(@"Room: %@", room);
    return room;
}

問題は「_」と「/」の文字です。辞書を印刷すると、次のようになります。

Room: { "_attachments" = { picture = { "content_type" = "text/plain"; data = BASE64; }; }; comment = 12; floor = 12; roomNumber = 12; status = 0; type = room; }

なぜ1行になってしまうのかわかりませんが、とにかく、それは重要ではありません. 問題は、「_」または「/」を含むキーが「-マーク」で囲まれてしまい、JSON を受信する Web エンドポイントがそれを読み取れないことです。これを解決する方法を知っている人はいますか?添付ファイルのキーから。

編集:私はそれを使用しています。関数 dataWithJSONObject:options:error: を呼び出して、辞書を NSJSONSerialization に渡します。その関数から取得したものを NSData オブジェクトに格納し、それをリクエストの http 本文として設定します。Content-Type は application/json です。また、Content-length なども設定します。HTTP リクエストを行う関数は次のとおりです。createDictionary上記の機能です。

// Make a JSON object from the dictionary
NSError *err;
NSData* jsonRoom = [NSJSONSerialization dataWithJSONObject:[room createDictionary]
                                                     options:NSJSONWritingPrettyPrinted
                                                       error:&err];

// Set up the http POST request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", _baseURL, @"/peters_hotell"]]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonRoom length]]
                          forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:jsonRoom];

NSLog(@"%@", jsonRoom);
// Fire the http POST request
//[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:callback];`

現在、sendRequest呼び出しはコメントアウトされていますが、使用すると、サーバーは要求を受け入れることができません。

これは、couchdb からの応答です。

Data: { error = badmatch; reason = false; }

添付ファイルの部分を辞書から外すと、couch は文句を言いません。基本的に私が作成しようとしているのは、この JSON (インライン添付ファイル) です: http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments

4

4 に答える 4

1

URLとJsonオブジェクトを投稿する場合は、サーバーに投稿する前に、を使用してURL文字列をエンコードします。

stringByAddingPercentEscapesUsingEncoding

また

NSUTF8Encodingテクニック。

于 2013-02-13T12:28:44.340 に答える
1

問題は、キー [...] が引用符で囲まれてしまい、JSON を受信する Web エンドポイントがそれを読み取れないことです。

いいえ、逆です。あなたが JSON だと思っているものは、実際には JSON ではありません。JSON ではキーを引用符で囲む必要があり:、等号ではなくコロン ( )を使用してキーと値を区切ります。

現在出力されているのはNSDictionaryオブジェクトの説明であり、JSON ではありません。これは、従来の NeXTSTEP スタイルのプロパティ リスト形式です。

使いたいのはNSJSONSerializationクラスです。

于 2013-02-13T12:21:03.483 に答える
0

助けてくれてありがとう!答えに導いてくれました。結局のところ、データ入力が有効な base64 ではないため、POST 要求が拒否されたため、couch が拒否しました。

于 2013-02-13T13:35:31.117 に答える