0

我有一个使用此调用创建的 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)。

我仍在调查,但任何提示都会有所帮助。

4

2 回答 2

0

您是否尝试过像上面提到的那样获取对象?因为我看到你正在使用 Codable。实际上,获取非常简单。

let yourObjectArray = JSONDecoder().decode([sWidget].self, data: json as! Data)

这条线可能有问题,但你可以用一条线来获取它们。

于 2018-08-09T14:48:10.680 回答
0

扩展@Cemal BAYRI 的答案:

JSONDecoder()抛出,所以请确保我们try?try(不要忘记do-catch使用try

guard let data = content as? Data else {
   return [sWidget]()
}

let jsonDecoder = JSONDecoder()

1.试试?

let yourObjectArray = try? jsonDecoder.decode([sWidget].self, data: data)

2.尝试

do {
  let yourObjectArray = try jsonDecoder.decode([sWidget].self, data: data)
} catch let error {
}  

注意:您需要处理DataDate格式化。下面是一个例子Date

jsonDecoder.dateDecodingStrategy = .iso8601

你也可以在这里查看

于 2018-08-09T15:00:14.867 回答