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 元素类型