【发布时间】:2018-08-09 14:40:09
【问题描述】:
我有一个使用此调用创建的 JSON 数组:
guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [Any] else {
print("This is not JSON!!!")
return
}
我正在尝试从数组中的 JSON 对象中获取元素以使用以下代码显示它们:
struct sWidget: Codable{
var createdBy: String
var createdDate: Date
var status: String
var widgetNumber: String
var updatedBy: String
var updatedDate: Date
}
do {
let decoder = JSONDecoder()
for (index, value) in json.enumerated() {
let currentWidget = try decoder.decode(sWidget.self, from: json[index] as! Data)
let currentNum = currentWidget.widgetNumber
//print(currentNum)
widgetNums.append(currentNum)
}
}
catch {
print("decoding error")
}
代码可以编译,但是当我运行它时,输出中出现此错误:
无法将“__NSDictionaryM”(0x1063c34f8) 类型的值转换为 'NSData' (0x1063c1090)。 2018-08-09 09:41:02.666713-0500 TruckMeterLogScanner[14259:1223764] 无法转换类型的值 '__NSDictionaryM' (0x1063c34f8) 到 'NSData' (0x1063c1090)。
我仍在调查,但任何提示都会有所帮助。
【问题讨论】:
-
这很正常,因为
json已经是 Dictionary/Array/String/Int 的数组,已经序列化,所以它里面不会有Data对象,所以json[index]不是(NS)Data对象,所以json[index] as! Data会崩溃。如果您只是对获取数字感兴趣,请在let widgets = jsonDecoder.decode([sWidget].self, data: content)之后发送,执行 widgetNums.append(contentsOf: widgets.map{$0.widgetNumber}`。
标签: json swift decoder jsondecoder swift-structs