首页 > 解决方案 > 用数组而不是字典解码 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()
    }
}

标签: jsonswiftapi

解决方案


您忘记解码顶级 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打印您可能遇到的错误。


推荐阅读