在 Swift 中使用 JSON 解码器难以解析 JSON 中的整数值
Posted
技术标签:
【中文标题】在 Swift 中使用 JSON 解码器难以解析 JSON 中的整数值【英文标题】:Difficulty parse integer value in JSON using JSON Decoder in Swift 【发布时间】:2020-07-28 13:59:51 【问题描述】:我正在尝试从如下所示的 API 解码一些 JSON(foo 是属性列表的缩写):
"page":1,"total_results":10000,"total_pages":500,"results":["foo":"bar","foo":"bar2","foo":"bar3"]
quicktype.io 推荐的对我来说也正确的结构是:
struct ObjectsReturned: Codable
let page, totalResults, totalPages: Int
let results: [Result]
enum CodingKeys: String, CodingKey
case page
case totalResults = "total_results"
case totalPages = "total_pages"
case results
// MARK: - Result
struct Result: Codable
let foo: String
但是,当我尝试解码时,虽然它能够处理页面,但它会在 total_results 上引发错误,如下所示:
typeMismatch(Swift.Dictionary
, Swift.DecodingError.Context(编码路径: [_DictionaryCodingKey(stringValue: "total_results", intValue: nil)], debugDescription: "预期解码 Dictionary 但是 而是找到了一个数字。”,基础错误:无))
此错误的原因可能是什么?我该如何解决?
感谢您的任何建议。
注意:
解码是通过:
do
let mything = try JSONDecoder().decode([String:ObjectReturned].self, from: data)
catch
print(error)
【问题讨论】:
那是正确的 json 吗?如果是,您应该将decode
称为decode(ObjectReturned.self, from: data)
【参考方案1】:
您正在尝试解码错误的类型。您的根对象是单个 ObjectsReturned
实例,而不是 [String:ObjectsReturned]
。
let mything = try JSONDecoder().decode(ObjectsReturned.self, from: json2)
【讨论】:
就是这样。谢谢!【参考方案2】:错误本身非常清楚,它表示您正在尝试解码Dictionary
,但JSONDecoder
找不到。您可能从其他地方复制了此代码,这可能是犯此错误的原因。您应该能够通过查看模型来找出模型。在这里您可以看到开头没有键值是预期的ObjectReturned
。如果JSON
是:
"someStringKey":"page":1,"total_results":10000,"total_pages":500,"results":["foo":"bar","foo":"bar2","foo":"bar3"]
您的解码应该有效。相反,在您的情况下,JSON
没有上例 "someStringKey"
中的前导键,因此您只需要:
do
let mything = try JSONDecoder().decode(ObjectsReturned.self, from: data)
print(mything)
catch
print(error)
最好将JSON
粘贴到Quicktype 并从那里生成结构模型以进行解码。希望这有助于解决任何与JSON
解码相关的困难。
【讨论】:
谢谢!赞成您对解释的深入回答,因为我已经接受了另一个。快速类型确实具有正确的 JSON 解码器代码。是的,我必须复制代码以按照您建议的格式解析不同的 api,并更改对象名称而不更改其余部分。 不客气。由于缺乏关注,这是一个常见的错误。无论如何快乐编码:) Quicktype 很棒,但偶尔会生成很多辅助类。当这种情况发生时,你会尝试改进它吗? ***.com/questions/63138535/…以上是关于在 Swift 中使用 JSON 解码器难以解析 JSON 中的整数值的主要内容,如果未能解决你的问题,请参考以下文章
我如何使用解码器在swift 4中解析tableview中的json数组
无法在 Swift 中解析 JSON。 “应解码 Dictionary<String, Any>,但找到了一个数组。” [复制]