我正在尝试向CouchDB服务器发出HTTP PUT请求。我正在将NSString实例转换为NSData。然后我将此NSData实例转换为NSArray并尝试将此PUT转换为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请求(这是rad btw;))
问题是这会创建一个类似于:
的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不会根据数组长度正确推断..但我想你可以争论任何一种方式。请参阅下面的选定答案。这就是我想要的。感谢所有回复的人!
答案 0 :(得分:1)
您可以让NSJSONSerialization
执行从Foundation对象到字符串的转换。这可以保证正确的转义并使代码更具可读性
如果您有上面示例中的键值对,则可以执行以下操作:
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? 我改变了它,如果我误解了你的问题,请把它改回来。