解析 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
,双引号中的everything是String
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)