ios - 序列化 JSON 而不用 [ ] 括起来

标签 ios objective-c json afnetworking nsjsonserialization

我正在尝试向 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 请求(顺便说一句,这是 rad ;))

问题是这会创建一个如下所示的 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 不仅仅根据数组长度正确推断。但我想你可能会争论任何一种方式。请参阅下面所选的答案。这就是我要找的。感谢所有回复的人!

最佳答案

您可以让 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 不包含在 [ ]" 中?
我改了,如果我误解了你的问题,请改回来。

关于ios - 序列化 JSON 而不用 [ ] 括起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17078676/

相关文章:

iOS 本地通知显示旧的应用程序名称

iphone - 切换 View 时 UIScrollView 顶部位置发生变化

java - 我怎样才能让 jackson 不把我的类(class)当作 map ?

php - 从 PHP JSON 响应中获取单个字段

objective-c - 是否可以使用 sharedHTTPCookieStorage 为 UIWebView 手动设置 cookie?

ios - UICollectionViewCell 以编程方式内存泄漏

objective-c - iOS 12.0 替代使用已弃用的 archiveRootObject :toFile:

ios - Google 横幅广告未在 Iphone x 中显示

objective-c - 界面中最好的类别或私有(private)属性是什么

php - 将我的 php 数组转换为 [object Object] json/JavaScript