1

编辑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; }

不知道为什么它会在那里结束,但无论如何,这并不重要。问题是带有“_”或“/”的键最终被“-marks”包围,我接收 JSON 的 Web 端点无法读取它。有谁知道我该如何解决这个问题?我使用 couchdb 并需要 _从附件键中。

编辑:我正在使用它,我将字典传递给 NSJSONSerialization,调用函数 dataWithJSONObject:options:error:。我将从该函数获得的内容存储在 NSData 对象中,并将其设置为我发出的请求中的 http 正文。内容类型是应用程序/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; }

当我将附件部分从字典中删除时,沙发不会抱怨。基本上我要创建的是这个 JSON(内联附件):http ://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments

4

4 回答 4

1

问题是键 [...] 最终被引号包围,而我接收 JSON 的 Web 端点无法读取它。

不,恰恰相反:你认为的 JSON 并不是真正的 JSON。JSON 需要引用键,它使用冒号 ( :) 而不是等号等分隔键和值。

您当前打印出的是NSDictionary对象的描述,而不是 JSON。它采用传统的 NeXTSTEP 样式的属性列表格式。

您要使用的是NSJSONSerialization类。

于 2013-02-13T12:21:03.483 回答
1

当您发布 url 和 Json 对象时,在将其发布到服务器之前,使用

stringByAddingPercentEscapesUsingEncoding

或者

NSUTF8编码技术..

于 2013-02-13T12:28:44.340 回答
0

谢谢您的帮助!它让我找到了答案。事实证明,我的 POST 请求被拒绝,因为我的数据输入不是有效的 base64,所以沙发拒绝了它。

于 2013-02-13T13:35:31.117 回答
0

代码:

@implementation NSString (NSString_Extended)

- (NSString *)urlEncoded
{
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                                                                NULL,
                                                                (CFStringRef)self,
                                                                NULL,
                                                                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                                kCFStringEncodingUTF8 );
    return [(NSString *)urlString autorelease];
}

@end
于 2013-02-13T13:49:42.210 回答