【问题标题】:JSON decoding double nested array in SwiftJSON解码Swift中的双嵌套数组
【发布时间】:2021-10-24 13:11:41
【问题描述】:

目前我正在尝试使用嵌套数组解码 JSON。嵌套数组可以在其中包含一些对象的随机数。我尝试解码它,但结果它返回错误

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)

【问题讨论】:

  • 你的结构是错误的。使用QuickType.io
  • 错误信息说明了一切,它是字典而不是数组!所以更像let itenaries : [String: [[Days]]]
  • 哦,我的错,我没有意识到我没有中间结构 @Paulw11 谢谢!
  • 感谢@JoakimDanielson 的提醒,感谢!
  • 到目前为止,我们只有四个相同的答案……

标签: ios arrays json swift decode


【解决方案1】:

您在哪里解码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)

【讨论】:

    【解决方案2】:

    我可能会做类似的事情

    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文件的结构 根结构 -> itenaries -> [[days]]

    希望你明白:)

    【讨论】:

      【解决方案3】:

      [已编辑] 你可以试试这些。 我使用这种方法得到了正确的结果

      Result

      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)
          }
      }
      
      

      【讨论】:

        【解决方案4】:

        你的模型不正确,用下面的替换:

        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)
        
        

        【讨论】:

        • 哦,我不知道,我会再检查一遍,谢谢!
        • @IkmalAzman 如果您对如何构建可解码模型有任何疑问,我建议您将 JSON 有效负载(您从文档/邮递员或其他任何地方获得)复制粘贴到 app.quicktype.io,它肯定会加快这个过程,同时让它更“安全”。
        • 好的,很好的建议,试试看
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多