iOS JSON 序列化空数组序列化为 nil 而不是 [ ]

Posted

技术标签:

【中文标题】iOS JSON 序列化空数组序列化为 nil 而不是 [ ]【英文标题】:iOS JSON serialization empty array serialized as nil instead of [ ] 【发布时间】:2013-08-09 20:51:15 【问题描述】:

我正在尝试将一些 JSON 发送到 Rails 后端。序列化有效负载(NSDictionary)时,空数组编码为 nil 而不是 [ ](空数组)。

ios 不支持 JSON 将空 NSArray 编码为 [] 吗?

我尝试更改 dataWithJSONObject: 中的“选项”,但没有成功。 将 @"[]" 作为常规 ol' NSString 发送也不起作用。

代码如下:

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:payload options:NSJSONReadingMutableLeaves error:&error];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
AFJSONRequestOperation *authRequest = [AFJSONRequestOperation JSONRequestOperationWithRequest:request  success:successBlock failure:failBlock];
[authRequest start];

感谢您的帮助!

【问题讨论】:

我在其他语言中看到了相反的情况,因为该语言没有 NSNull 等效项,所以使用了空数组。猜猜我从来没有打电话在 iOS 上发送一个空数组。 我建议您将NSError * 对象的地址传递给error: 参数,然后在返回时检查它。 顺便说一句,NSJSONReadingMutableLeavesread JSON 的选项,而不是 write JSON。 也许你应该显示你的实际payload,以及[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]的输出。 你提到payloadNSDictionary,那么为什么你有一个空数组[] 作为顶层对象呢?另外,发送包含@"[]"NSString……在哪里?进入JSON序列化方式? 【参考方案1】:

我怀疑问题出在 Rails 而不是 iOS,自 3.2.11 以来存在与 Rails 中的安全漏洞相关的问题

https://github.com/rails/rails/issues/8832

https://github.com/rails/strong_parameters/issues/82

例如:

在你的正文中发送一个空数组"bookmarks":[]

在 Rails 中序列化为:"bookmarks"=>nil

要确定问题出在哪里,您应该使用像 Charles 这样的代理检查请求。

【讨论】:

以上是关于iOS JSON 序列化空数组序列化为 nil 而不是 [ ]的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的 JObjects 被序列化为空数组

如何反序列化json空数组

JSON.Net 将集合序列化为数组数组

将表单序列化为没有空值的 json

Newton JSON 如何将对象序列化为空括号?

使用Jackson将JSON数组反序列化为单个Java对象