json - Marvel API Swift4 JSON 解码

标签 json swift api nested decode

我正在制作一个基本的 IOS 应用程序,基于 Apple 的“使用 Swift 进行应用程序开发”一书。我的应用程序使用 Marvel API。我正在尝试找到英雄的名字和描述。
与API的连接工作正常,并且已经过多次测试。这个问题与此无关。

我的问题是 JSON 结果嵌套了 3 次,我不知道如何在 Swift 4 中实现这一点。

这里是 1 位英雄的 JSON 结果示例。所有英雄都可以在“结果”中找到

The JSON structure can be found here

我的代码有一个 fatal error :

Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "results", intValue: nil)

let jsonDecoder = JSONDecoder()
    let task = URLSession.shared.dataTask(with: url) { (data,
        response, error) in
        try! jsonDecoder.decode(CharactersContainer.self, 
from: data!) //error here
        if let data = data,
            let char = try? jsonDecoder.decode(CharactersContainer.self, from: data) {
            print(char.characters)
            print("succes")

        } else {
            print("failed")
        }
    }

现在这是我的模型:

import Foundation

struct Character: Codable {
    var name: String
    var description: String
    //var url: Image


    enum CodingKeys: String, CodingKey {
        case name
        case description
        //case url = "thumbnail"

    }
    init(from decoder: Decoder) throws {
        let valueContainer = try decoder.container(keyedBy: CharactersContainer.CodingKeys.self).nestedContainer(keyedBy: Characters.CodingKeys.self, forKey: .characters).nestedContainer(keyedBy: Character.CodingKeys.self, forKey: .characters)
        if let name = try valueContainer.decodeIfPresent(String.self, forKey: CodingKeys.name) {
            self.name = name
        } else {
            self.name = ""
        }
        if let description = try valueContainer.decodeIfPresent(String.self, forKey: CodingKeys.description) {
            self.description = description
        } else {
            self.description = ""
        }

       // self.url = try valueContainer.decode(URL.self, forKey: CodingKeys.url)

    }
}



struct Characters : Decodable{
    var characters : [Character]
    enum CodingKeys: String, CodingKey {
        case characters = "data"
    }
}

struct CharactersContainer : Decodable {
    var characters : Characters
    //var total: Int
    enum CodingKeys: String, CodingKey {
        case characters = "results"
        //case total
    }
}

我不知道我做错了什么,因为我看到了一些做同样事情的例子。

感谢您的关注!

最佳答案

在 JSON 中,data 包含 results 键。根据您的 key 设置方式,它期望结果包含数据 key 。

CharactersContainer.CodingKeys.characters 可能应该是 "data"

Characters.CodingKeys.characters 可能应该是“结果”

<小时/>

编辑:

角色还存在另一个问题。它正在尝试获取由 CharactersContainer.CodingKeys.self 键控的包含,但它可能应该是 Character.CodingKeys.self

关于json - Marvel API Swift4 JSON 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53435448/

相关文章:

api - 为什么Docker “ancestry” API命令不起作用?

c++ - CPython API 与 C++ 类相结合

json - 如何在JMESPath表达式中使用变量?

javascript - 如何使用 Meteor.js 中的模板助手遍历对象中的两个数组

c# - 需要帮助序列化/反序列化这个 JSON

ios - 为什么 UIImageview 不是完美的圆?

ruby-on-rails - Rails 不处理 get 请求中的 JSON 参数

arrays - 在 Swift 中遍历数组时,是否有循环索引/迭代的引用?

Swift 将数据从 TabBarController 传递到 TableViewController

Angular 7 PATCH方法将元素添加到列表