簡體   English   中英

解析嵌套的JSON SWIFT 4

[英]Parsing Nested JSON SWIFT 4

誰能告訴我我在做什么錯?

這是我要解析的JSON:

{
"results": {
    "AF": {
        "alpha3": "AFG",
        "currencyId": "AFN",
        "currencyName": "Afghan afghani",
        "currencySymbol": "؋",
        "id": "AF",
        "name": "Afghanistan"
    },
    "AI": {
        "alpha3": "AIA",
        "currencyId": "XCD",
        "currencyName": "East Caribbean dollar",
        "currencySymbol": "$",
        "id": "AI",
        "name": "Anguilla"
    }
}

}

我的代碼:

class Results: Codable {
  let results: [Country]

  init(results: [Country]) {
    self.results = results
  }
}

class Country: Codable {

  let currencyId: String
  let currencyName: String
  let currencySymbol: String
  let id: String
  let name: String


  init(currencyId :String, currencyName: String, currencySymbol: String, id: String, name: String ) {

    self.currencyId = currencyId
    self.currencyName = currencyName
    self.currencySymbol = currencySymbol
    self.id = id
    self.name = name

  }
}

我看過Apple的有關解碼嵌套結構的文檔,但我仍然不明白如何正確地執行JSON的不同級別。

謝謝。

檢查鍵"results"的輪廓值。

"results": {
    ...
}

{...}表示JSON對象。 在某些情況下,Swift struct (或class如果您認為更好的話)將適用於JSON對象。

在其他情況下,快速Dictionary可能更合適。

並且此JSON對象的每個值都采用以下形式:

{
    "alpha3": ...,
    "currencyId": ...,
    "currencyName": ...,
    "currencySymbol": ...,
    "id": ...,
    "name": ...
}

與您的Country匹配。

所以,你只需要改變的類型, results在你的Results類。

class Results: Codable {
    let results: [String: Country]

    init(results: [String: Country]) {
        self.results = results
    }
}

對於屬性及其類,使用相同的名稱(不區分大小寫)在將來可能會引起一些混亂,但是我還是照原樣保留它。

您可以像這樣測試它:

(假設要在具有修改過的Results和您所在的Country的操場上進行測試。)

let jsonText = """
{
    "results": {
        "AF": {
            "alpha3": "AFG",
            "currencyId": "AFN",
            "currencyName": "Afghan afghani",
            "currencySymbol": "؋",
            "id": "AF",
            "name": "Afghanistan"
        },
        "AI": {
            "alpha3": "AIA",
            "currencyId": "XCD",
            "currencyName": "East Caribbean dollar",
            "currencySymbol": "$",
            "id": "AI",
            "name": "Anguilla"
        }
    }
}
"""
let jsonData = jsonText.data(using: .utf8)!

let decoder = JSONDecoder()
do {
    let results = try decoder.decode(Results.self, from: jsonData)
    print(results) //-> __lldb_expr_1.Results
} catch {
    print(error)
}

暫無
暫無

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

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