序列化JSON而不包装在[]中

时间:2013-06-13 03:22:06

标签: ios objective-c json afnetworking nsjsonserialization

我正在尝试向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不会根据数组长度正确推断..但我想你可以争论任何一种方式。请参阅下面的选定答案。这就是我想要的。感谢所有回复的人!

1 个答案:

答案 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? 我改变了它,如果我误解了你的问题,请把它改回来。