解析 JSON 错误“预期解码 Array<Any> 但找到了一个数字

Posted

技术标签:

【中文标题】解析 JSON 错误“预期解码 Array<Any> 但找到了一个数字【英文标题】:Parsing JSON error "Expected to decode Array<Any> but found a number instead 【发布时间】:2020-02-03 21:27:55 【问题描述】:

我正在尝试显示来自假后端 JSON 文件的数据。我正在尝试从“shipment_items”键一侧的数组中收集数据。我知道我的代码结构不正确,因为我不断收到错误 typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "id", intValue: nil)], debugDescription: "预期解码 Array 但找到了一个数字。",底层错误: nil))

       struct Items: Codable 
    var itemName: String?
    var price: Int?
    var brand: String?
    var size: String?


//Custom Keys
enum CodingKeys: String, CodingKey
    case itemName = "name"
    case price = "price"
    case brand = "brand"
    case size = "size"



func parseData()
    guard let url = URL(string: "https://xxxxxxx")
        else return
    let task = URLSession.shared.dataTask(with: url)  (data, response, error) in
        guard let dataResponse = data,
            error == nil else 
                print(error?.localizedDescription ?? "Error")
                return 
        do
            let decoder = JSONDecoder()

            let model = try decoder.decode([String:[Items]].self, from: dataResponse)
            print(model["shipment_items"])


         catch let parsingError 
            print("Error", parsingError)
        
    
    task.resume()

【问题讨论】:

【参考方案1】:

错误很明显:请查看JSON的根对象,键id的值为5,这是一个Int,而不是[Items]。这就是 Expeded to decode Array but found a number 告诉你的。

您必须为根对象添加一个伞形结构。

price的类型是String,双引号中的everythingString

struct Root : Decodable 
    let id : Int
    let items : [Item]

    enum CodingKeys: String, CodingKey  case id, items = "shipment_items" 


struct Item : Decodable 
    let itemName: String
    let price: String
    let brand: String
    let size: String

    enum CodingKeys: String, CodingKey 
        case itemName = "name", price, brand, size
    

然后解码

let model = try decoder.decode(Root.self, from: dataResponse)
print(model.items)

【讨论】:

以上是关于解析 JSON 错误“预期解码 Array<Any> 但找到了一个数字的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 JSON Parsing(预期解码 Array<Any> 但找到了字典)

debugDescription:“预期解码 Array<Any>,但找到了字典。”,underlyingError:nil)

预期解码 Array<Any> 但找到了字典

json解析错误怎么办?

json解析出错误

JSON 解析错误获取 brautaset.JSON 错误