3

我在解码响应数据时遇到问题。这是我的请求功能

  @IBAction func onGetCities(_ sender: UIButton) {

    guard let url = URL(string: "http://somelink.com/city-list") else { return }

    var request = URLRequest(url: url)
    request.httpMethod = "GET"

    let session = URLSession.shared
    let task = session.dataTask(with: request) { (data, response, error) in


        print(JSON(data))
        guard let data = data else { return }
        do{
            let cities = try JSONDecoder().decode([City].self, from: data)
            print(cities)
        }catch{

        }
    }
    task.resume()
}

和城市结构

struct City: Decodable {
    let id: Int
    let city: String
}

这是响应数据,我想解码“项目”

{
"offset": 0,
"limit": 10,
"items": [
  {id: 0, name: "City name"},
  {id: 1, name: "City name1"},
  .....
]

}
4

1 回答 1

4

您需要具有反映嵌套 JSON 的嵌套结构:

struct City: Decodable {
    let id: Int
    let city: String
}

struct ResponseObject: Decodable {
    let items: [City]
    let offset: Int
    let limit: Int
}

接着:

do {
    let result = try JSONDecoder().decode(ResponseObject.self, from: data)
    print(result)

    let cities = result.items
    print(cities)
} catch {
    print(error)
}

请注意,在您的原始示例中,您包含了一个 JSON 密钥,updated_at它是自 1970 年以来以秒数表示的日期(标准 UNIX 表示)。所以,要解码:

struct City: Decodable {
    let id: Int
    let city: String
}

struct ResponseObject: Decodable {
    let items: [City]
    let offset: Int
    let limit: Int
    let code: Int
    let updatedAt: Date

    enum CodingKeys: String, CodingKey {
        case items, offset, limit, code
        case updatedAt = "updated_at"
    }
}

接着:

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970

do {
    let result = try decoder.decode(ResponseObject.self, from: data)
    print(result)

    let cities = result.items
    print(cities)
} catch {
    print(error)
}
于 2018-02-25T21:43:00.017 回答