使用Decodable解析数组

时间:2018-02-14 20:11:41

标签: ios json swift4 decodable

这是我的JSON,我试图解析并想要理解容器概念。

 {
"results": [
{
  "type": "TEST",
  "date": 1518633000000,
  "slots": [
    {
      "startDatetime": 1518665400000,
      "endDatetime": 1518667200000,
    },
    {
      "startDatetime": 1518667200000,
      "endDatetime": 1518669000000,
    }
  ]
}
]
}

这就是我正在尝试使用我的代码。我还为slots确定了可解码协议的结构。我在解析Expected to decode Dictionary<String, Any> but found an array instead时收到此错误。请使用覆盖可解码协议给我解决方案。 当解码器尝试解码结果时,此行发生错误。

struct Slots: Codable
{
var startDateTime: UInt64?
var endDateTime: UInt64?
}

struct Results:Codable {
var type:String?
var date:UInt64?
var slots:[Slots]?

private enum CodingKeys:String, CodingKey
{
    case type
    case date
    case slots
}

private enum ResultsKey: String, CodingKey
{
    case results
}

public init(from decoder:Decoder) throws
{
   let values = try decoder.container(keyedBy: ResultsKey.self)
    let resultsValues = try values.nestedContainer(keyedBy: CodingKeys.self, forKey: .results)
    type = try resultsValues.decode(String.self, forKey: .type)
    date = try resultsValues.decode(UInt64.self, forKey: .date)
    slots = try resultsValues.decode([Slots].self, forKey: .slots)
}
}

 if let data = response.data {
            // init the decoder here
            let decoder = JSONDecoder()

            // Error occurs here
            let results = try! decoder.decode(Results.self, from: data)
        }

1 个答案:

答案 0 :(得分:1)

这是经典的错误。您忘记了根(最外层)对象,即带有键[['10.220.88.1', '0062.ec29.70fe'], ['10.220.88.40', '001c.c4bf.826a']] 的字典。

您不需要任何编码密钥或初始化程序,您可以通过添加一行直接将时间戳解码为results

Date

假设struct Root : Decodable { let results : [Result] } struct Result : Decodable { let type : String let date : Date let slots: [Slot] } struct Slot : Decodable { let startDatetime, endDatetime : Date } data格式

中的JSON字符串
Data

并且不要将每个属性示意性地粗心地声明为可选