Swift JSON 错误,无法将类型“__NSArrayM”(0x507b58)的值转换为“NSDictionary”(0x507d74)

Posted

技术标签:

【中文标题】Swift JSON 错误,无法将类型“__NSArrayM”(0x507b58)的值转换为“NSDictionary”(0x507d74)【英文标题】:Swift JSON error, Could not cast value of type '__NSArrayM' (0x507b58) to 'NSDictionary' (0x507d74) 【发布时间】:2015-05-10 13:07:02 【问题描述】:

我正在尝试从 url(json 文件)中获取数据,但在以下几行中出现此错误:

var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as! NSDictionary
if (err != nil) 
    println("JSON Error \(err!.localizedDescription)")

错误提示

线程 6:信号 SIGABIRT - 无法将类型“__NSArrayM”(0x518b58) 的值转换为“NSDictionary”(0x518d74)。

【问题讨论】:

访问 json.org 并研究 JSON 语法。学习只需5-10分钟。接下来,扔掉你抄袭的任何例子,并实际编写与 JSON 匹配的代码,了解 JSON 数组 ([ ]) 映射到 NSArray,而 JSON 对象 ( ) 映射到 NSDictionary。 【参考方案1】:

无论 JSON 文件数据是什么样的,***对象都是一个数组。因为您为 options: 参数传递了 .MutableContainers,所以反序列化会返回一个可变数组。

您将其强制转换为 NSDictionary

as! NSDictionary

但你不能这样做,因为它是一个数组,而不是字典。

正确的做法完全取决于我们编写代码的目的。

我们是否总是在此处反序列化相同的 JSON?它是否总是具有相同的结构?

如果我们不是,我们需要一种更动态的方法。但如果我们是,这个错误表明您正在反序列化一个数组,所以让我们将as! NSDictionary 更改为:

as NSMutableArray

这将做几件事。

由于我们都在抓取可变对象,这将返回给我们可变对象(否则我们不应该将它们视为可变对象)。

我们实际上会读回正确的类型(数组与字典)。

通过删除!,我们将得到一个可选的。好消息是,这意味着我们的代码不会因为收到意外的 JSON 而崩溃。

【讨论】:

我应该如何改变它? 去掉as! NSDictionary。停止在 Swift 中滥用 ! 运算符。

以上是关于Swift JSON 错误,无法将类型“__NSArrayM”(0x507b58)的值转换为“NSDictionary”(0x507d74)的主要内容,如果未能解决你的问题,请参考以下文章

Swift JSON 错误,无法将类型“__NSArrayM”(0x507b58)的值转换为“NSDictionary”(0x507d74)

Swift 3:NSArray 元素无法匹配 Swift Array 元素类型

Swift JSON解码器类型不匹配错误

Swift 4.1 - 无法将 [Character] 类型的值转换为 [String]

是啥导致了 Swift 中的“无法转换类型”错误?

Swift - JSON 写入中的***类型无效