在 Swift 中使用 JSON 解码器难以解析 JSON 中的整数值
Difficulty parse integer value in JSON using JSON Decoder in Swift
我正在尝试从如下所示的 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.String, Any>,
Swift.DecodingError.Context(codingPath:
[_DictionaryCodingKey(stringValue: "total_results", intValue: nil)],
debugDescription: "Expected to decode Dictionary<String, Any> but
found a number instead.", underlyingError: nil))
出现此错误的原因是什么?我该如何解决?
感谢您的任何建议。
注:
解码通过:
do {
let mything = try JSONDecoder().decode([String:ObjectReturned].self, from: data)
} catch {
print(error)
}
您正在尝试解码错误的类型。您的根对象是单个 ObjectsReturned
实例而不是 [String:ObjectsReturned]
.
let mything = try JSONDecoder().decode(ObjectsReturned.self, from: json2)
错误本身很明显,它说您正在尝试解码 Dictionary
但 JSONDecoder
找不到。您可能从其他地方复制了这段代码,这可能是犯此错误的原因。您应该能够通过查看模型来弄清楚模型。在这里可以看到,开头并没有key的值是预期的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
解码相关的困难。
我正在尝试从如下所示的 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.String, Any>, Swift.DecodingError.Context(codingPath: [_DictionaryCodingKey(stringValue: "total_results", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found a number instead.", underlyingError: nil))
出现此错误的原因是什么?我该如何解决?
感谢您的任何建议。
注:
解码通过:
do {
let mything = try JSONDecoder().decode([String:ObjectReturned].self, from: data)
} catch {
print(error)
}
您正在尝试解码错误的类型。您的根对象是单个 ObjectsReturned
实例而不是 [String:ObjectsReturned]
.
let mything = try JSONDecoder().decode(ObjectsReturned.self, from: json2)
错误本身很明显,它说您正在尝试解码 Dictionary
但 JSONDecoder
找不到。您可能从其他地方复制了这段代码,这可能是犯此错误的原因。您应该能够通过查看模型来弄清楚模型。在这里可以看到,开头并没有key的值是预期的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
解码相关的困难。