0

我正在尝试向 CouchDB 服务器发出 HTTP PUT 请求。我正在将 NSString 实例转换为 NSData。然后我将此 NSData 实例转换为 NSArray 并尝试将其放入 CouchDB。所以是这样的:

//convert string to NSData
    NSData *docData = [@"{\"name\":\"nick\"}" dataUsingEncoding:NSUTF8StringEncoding];
//NSData to NSArray
    NSArray *arrayJson = [NSArray arrayWithObjects:[NSJSONSerialization JSONObjectWithData:docData options:kNilOptions error:nil],nil];

然后我使用AFNetworking创建一个 HTTP PUT 请求(顺便说一句;))

问题是这会创建一个 json 字符串,如下所示:

[{"name":"nick"}]

这是有效的 JSON,但 Couch 抱怨 400 Bad JSON。删除 [ ] 可以解决问题。我确定这些括号是将 NSData 转换为 NSArray 的结果,但我不确定如何使用 NSJSONSerialization 来完成此操作。任何人都可以帮忙吗?

谢谢!

编辑

为了清楚起见,让我进一步解释我遇到的问题。我正在使用 PUT HTTP 请求使用 CouchDB HTTP API 创建一个文档。该文档可以是手工编码的 JSON,这就是我遇到这个解析挑战的原因。Couch 期望创建一个文档。因此它需要一个 JSON 对象。不是它们的数组。这似乎是 [{"key":"value"}] 从 Couch 返回 400 HTTP 响应的原因。即使数组包含单个对象。API 不会仅仅根据数组长度正确推断,这似乎有点挑剔。但我想你可以用任何一种方式争论。请参阅下面的选定答案。这就是我一直在寻找的。感谢所有回复的人!

4

1 回答 1

1

您可以让NSJSONSerializationFoundation 对象转换为字符串。这保证了正确的转义并使代码更具可读性。
如果您有上面示例中的键值对,则可以执行以下操作:

NSError* error = nil;
NSDictionary* jsonDict = @{@"name": @"nick"};
NSData* putData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:&error];

您应该能够直接将其放入PUT请求的内容中,而无需将其包装在额外的数组中。如果处理请求的端点要求您发送数组,您应该将数组创建为 Foundation 对象 ( NSArray) 并将其序列化为 JSON,然后再将其发送到服务器:

NSArray* jsonArray = @[@{@"name": @"nick"}];

您的问题的标题是反序列化JSON 而不用 [] 包装” - 那不应该是序列化JSON 而不用 [] 包装”吗?
我改了,如果我误解了你的问题,请改回来。

于 2013-06-13T07:50:11.187 回答