簡體   English   中英

JSON 解碼 Swift 中的雙嵌套數組

[英]JSON decoding double nested array in Swift

目前我正在嘗試使用嵌套數組解碼 JSON。 嵌套數組可以在其中包含 object 的一些隨機數。 我嘗試對其進行解碼,但結果返回錯誤

CodingKeys(stringValue: "itenaries", intValue: nil),
debugDescription : "Expected to decode Array<Any> but found a dictionary 

樣本 JSON 數據

{
   "itenaries": {
      "days":
      [
         [
            {
               "itenary_id":0,
               "itenary_location_name":"Batu Caves Temple"
            }
     
         ],
         [
            {
               "itenary_id":0,
               "itenary_location_name":"KL Tower "
            },
            {
               "itenary_id":1,
               "itenary_location_name":"KL Forest Eco Park"
            }
         ]
      ]
   }
}

我的結構

struct Itenaries : Codable {
    let itenaries : [[Days]]
}

struct Days : Codable {
    let itenary_id : Int
    let itenary_location_name : String
}

解碼實現

let decoder = JSONDecoder()
let itenary = try decoder.decode(Itenaries.self, from: fileData)
print(itenary.itenaries[0][0].itenary_id)

你在哪里解碼days鍵? 那就是問題所在。 你需要一個中間結構

struct Root : Decodable {
    let itenaries : Itenary
}

struct Itenary : Decodable {
    let days : [[Days]]
}

...

let result = try decoder.decode(Root.self, from: fileData)
print(result.iternaries.days[0][0].itenary_id)

我可能會做類似的事情

struct Name:Codable {
    var itenaries:itenaries
}

struct itenaries:Codable {
    var days = [[Days]]
}
struct Days : Codable {
    let itenary_id : Int
    let itenary_location_name : String
}

所以基本上根據你的 Json 文件的結構 Root struct -> itenaries -> [[days]]

希望你能理解:)

[編輯]你可以試試這些。 我使用這種方法得到了正確的結果

結果

struct MainResponse : Codable {
    let itenaries : Itenaries
}

struct Itenaries : Codable {
    let days : [[Days]]
}

struct Days : Codable {
    let itenary_id : Int
    let itenary_location_name : String
}

if let path = Bundle.main.path(forResource: "nested_array", ofType: "json") {
    do {
        let responseData = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
        let decoder = JSONDecoder()
        let mainResponse = try decoder.decode(MainResponse.self, from: responseData)
        print(mainResponse.itenaries.days[0][0].itenary_id)
        print(mainResponse.itenaries.days[0][0].itenary_location_name)
        print(mainResponse.itenaries.days[1][0].itenary_id)
        print(mainResponse.itenaries.days[1][0].itenary_location_name)
        print(mainResponse.itenaries.days[1][1].itenary_id)
        print(mainResponse.itenaries.days[1][1].itenary_location_name)

        // output
        // 0
        // Batu Caves Temple
        // 0
        // KL Tower 
        // 1
        // KL Forest Eco Park
    } catch let error {
        print(error.localizedDescription)
    }
}

您的 model 不正確,請將其替換為以下內容:

struct ItenariesResponse: Codable {
    let itenaries: Itenaries
}

struct Itenaries: Codable {
    let days: [[Day]]
}

struct Day: Codable {
    let itenaryID: Int
    let itenaryLocationName: String

    enum CodingKeys: String, CodingKey {
        case itenaryID = "itenary_id"
        case itenaryLocationName = "itenary_location_name"
    }
}

然后像這樣替換您解碼的類型:

let itenary = try decoder.decode(ItenariesResponse.self, from: fileData)

暫無
暫無

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

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