首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >漫威API Swift4 JSON解码

漫威API Swift4 JSON解码
EN

Stack Overflow用户
提问于 2018-11-22 16:55:56
回答 1查看 505关注 0票数 0

我正在制作一个基础的IOS应用程序,基于苹果的“应用程序开发与Swift”的书。我的应用程序使用Marvel API。我想找到英雄的名字和描述。

与API的连接完全正常,并且已经过多次测试。这个问题与此无关。

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

下面是一个1英雄的JSON结果的例子。所有英雄都可以在“结果”中找到。

在这里可以找到JSON结构

我的代码有一个致命错误:

Swift.DecodingError.keyNotFound(CodingKeys(stringValue:“结果”,intValue: 0)

代码语言:javascript
复制
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")
        }
    }

下面是我的模特们:

代码语言:javascript
复制
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
    }
}

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

谢谢您的入住!

EN

回答 1

Stack Overflow用户

发布于 2018-11-22 17:02:14

在JSON中,data包含results键。按照设置密钥的方式,它期望results包含一个data键。

CharactersContainer.CodingKeys.characters应该是"data"

Characters.CodingKeys.characters应该是"results"

编辑:

Character还有另一个问题。它试图获得一个由CharactersContainer.CodingKeys.self键决定的包含,但可能应该是Character.CodingKeys.self

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53435448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档