json - 用数组而不是字典解码 JSON 对象
问题描述
我正在使用一个 API,它以以下格式返回 JSON 对象:
{
"cards": [
{
"name": "Charizard"
},
...
]
}
当我尝试对此进行解码时,它说它不是有效的 JSON……它说它需要一个数组但有一个字典。我有一种感觉是因为我实际上并没有从对象中选择卡片数组?但我不知道如何修改我的代码片段来实现它......
import SwiftUI
struct Card: Codable {
var name: String
}
class Api {
func getCards(completion: @escaping ([Card]) -> ()) {
guard let url = URL(string: "https://api.pokemontcg.io/v1/cards") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
let cards = try! JSONDecoder().decode([Card].self, from: data!)
print(cards)
//DispatchQueue.main.async {
// completion(cards)
//}
}
.resume()
}
}
解决方案
您忘记解码顶级 JSON 对象。
您可以像这样创建另一个结构:
struct Response: Codable {
var cards: [Card]
}
并使用以下代码解码您的 JSON:
do {
let response = try JSONDecoder().decode(Response.self, from: data!)
} catch {
print(error)
}
或者您可以[String: [Card]]
用作解码类型:
do {
let response = try JSONDecoder().decode([String: [Card]].self, from: data!)
} catch {
print(error)
}
无论哪种方式,永远不要使用try!
. 最好do-catch
打印您可能遇到的错误。
推荐阅读
- python - Ubuntu 20.04 LTS 上的 Tensorflow 2.2.0 GPU 支持
- python - 我怎样才能同时运行 tkinter 和 watchdog
- java - 如何在 Java 项目中找到主类?
- c# - 如何强制 VSCode Omnisharp 不使用 MONO?
- spring-boot - 在 Spring Boot 中使用 Ehcache 在 List Cacheable 中查找对象
- laravel - Laravel:创建按钮返回相同的视图但空白并且不创建任何记录
- c++ - 是否可以针对 openmp 优化我的代码?
- submit - 在我的 APP 中修改了提交和最后一个 powerApps 的文件夹的问题
- node.js - 仅在第一次尝试时执行 MongoDB bulkWrite replaceOne 时出现不可变 _id 错误
- c# - 为什么在 C# 的这种情况下局部变量的名称会发生冲突?