簡體   English   中英

在 Swift 錯誤中使用可解碼解析 JSON

[英]Parsing JSON with Decodable in Swift Error

我想從帶有結構和可解碼函數的 HTTP 請求中解析一個簡短的 JSON 請求。 聲明如下:

struct Wert: Codable {
    let age: String
    let first_name: String
}

let session = URLSession.shared
    let url = URL(string: "https://learnappmaking.com/ex/users.json")!

我的代碼發出請求並嘗試解析:


            guard let data = data else { return }

            do {
                let preis = try JSONDecoder().decode(Wert.self, from: data)
                print(preis);
            }
                catch {
                    print("JSON error: \(error.localizedDescription)")
                }
        }.resume()

我確實收到錯誤消息:“JSON 錯誤:無法讀取數據,因為它的格式不正確。” 而且我不知道代碼有什么問題

JSON 看起來像:

  {
    "first_name": "Ford",
    "last_name": "Prefect",
    "age": 5000
  },
  {
    "first_name": "Zaphod",
    "last_name": "Beeblebrox",
    "age": 999
  },
  {
    "first_name": "Arthur",
    "last_name": "Dent",
    "age": 42
  },
  {
    "first_name": "Trillian",
    "last_name": "Astra",
    "age": 1234
  }
]

如果有人可以幫助我就好了。

錯誤:

您使用的JSON無效。 有效的JSON將是,

[{"first_name":"Ford","last_name":"Prefect","age":5000},{"first_name":"Zaphod","last_name":"Beeblebrox","age":999},{"first_name":"Arthur","last_name":"Dent","age":42},{"first_name":"Trillian","last_name":"Astra","age":1234}]

模型:

使用Int作為age而不是String數據類型,

struct Wert: Decodable {
    let firstName, lastName: String
    let age: Int
}

解析:

1.解析時使用[Wert].self代替Wert.self ,即

2.使用decoder.keyDecodingStrategy = .convertFromSnakeCase處理JSON中的snake-case(下划線)key,即

if let url = URL(string: "https://learnappmaking.com/ex/users.json") {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let data = data {
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let preis = try decoder.decode([Wert].self, from: data)
                print(preis)
            } catch {
                print(error)
            }
        }
    }.resume()
}

您需要為自定義密鑰提供編碼密鑰。

struct Wert: Codable {
    let age: String
    let firstName: String

    enum CodingKeys: String, CodingKey {
        case age, firstName = "first_name"
    }
}

Age 不是您的 Json 文件中的字符串類型,請按如下方式更新您的映射。

struct Wert: Codable {
    let age: Int
    let first_name: String
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM