序列化JSON时出错";keyNotFound";

序列化JSON时出错";keyNotFound";,json,swift,codable,Json,Swift,Codable,我正在练习在Swift 4中解析JSON的新方法,并且我正在使用《纽约时报》API——我发现很难阅读JSON的结构,因为API页面刚刚打开 我已经为我想要提取的数据(标题、摘要)编写了一个小结构: 下面是我调用以获取JSON的函数: func getJSON() { let jsonUrlString = "https://api.nytimes.com/svc/topstories/v1/business.json?api-key=f4bf2ee721031a344b84b0449cf

我正在练习在Swift 4中解析JSON的新方法,并且我正在使用《纽约时报》API——我发现很难阅读JSON的结构,因为API页面刚刚打开

我已经为我想要提取的数据(标题、摘要)编写了一个小结构:

下面是我调用以获取JSON的函数:

func getJSON() {
    let jsonUrlString = "https://api.nytimes.com/svc/topstories/v1/business.json?api-key=f4bf2ee721031a344b84b0449cfdb589:1:73741808"
    guard let url = URL(string: jsonUrlString) else {return}

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else {return}

        do {

            let stories = try
                JSONDecoder().decode(Stories.self, from: data)
            print(stories.title, stories.abstract)

        } catch let jsonErr {
            print("Error serializing JSON", jsonErr)
        }
    }.resume()
}
运行应用程序时,我会在控制台中看到我的错误消息:

Error serializing JSON keyNotFound(CodingKeys(stringValue: "title", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"title\", intValue: nil) (\"title\").", underlyingError: nil))
因此,它似乎没有找到“标题”的价值。我可以在这里做什么不同的事情,我是否设置了错误的结构?还是我用错了JSONDecorder


谢谢你的帮助

问题在于
故事
嵌套在外部
字典
中,您还需要对其进行解析

struct TopStoriesResponse: Codable {
    let status:String
    let results:[Story]
}

struct Story: Codable {
    let title: String
    let abstract: String
}

func getTopStories() {
    let jsonUrlString = "https://api.nytimes.com/svc/topstories/v1/business.json?api-key=f4bf2ee721031a344b84b0449cfdb589:1:73741808"
    guard let url = URL(string: jsonUrlString) else {return}

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data, err == nil else {
            print(err!)
            return
        }

        do {
            let response = try JSONDecoder().decode(TopStoriesResponse.self, from: data)
            print(response.results.first?.title, response.results.first?.abstract)

        } catch let jsonErr {
            print("Error serializing JSON", jsonErr)
        }
    }.resume()
}

“我发现很难阅读JSON的结构,因为API页面只显示了一堵文本墙”:使用Safari/Chrome或其他可以对JSON进行漂亮/美化的扩展,或者使用在线工具复制/粘贴JSON的内容。首先,你忽略了一个事实,那就是之前有一个键
results
,它是一个故事数组(不是一个故事)。请尝试这里,谢谢Ashley Mills,我肯定会将该网站添加到书签中。我很头痛,想弄清楚它是怎么形成的。我明白了,那肯定是我出错的地方!在使用Ashley Mills给我的链接后,JSON更容易阅读,我没有意识到它是这样嵌套的。感谢您的建议-虽然我在
结构TopStorieResponse:Codable
旁边收到一个错误,说它不符合可编码协议。@KingTim my bad,这是我这边的一个输入错误,请检查我更新的答案。使
Story
符合
Decodable
而不是
Codable
意外。Ok现在似乎可以工作了,只是它只打印了一个标题/摘要。难道[Story]数组不会抓取所有标题/摘要吗?@KingTim更仔细地检查我的代码,我只打印第一个元素:)你可以简单地执行
打印(response.results)
如果您想全部打印。好的,我知道了,谢谢。为了澄清,我试图最终得到一个包含所有标题的数组和一个包含所有摘要的数组(这样我就可以把它们放到一个表视图中)。如果我创建一个变量,比如说,
var headlines=[String]()
,那么在数据请求期间如何仅从JSON中提取标题,以便将它们全部附加到该数组中?
struct TopStoriesResponse: Codable {
    let status:String
    let results:[Story]
}

struct Story: Codable {
    let title: String
    let abstract: String
}

func getTopStories() {
    let jsonUrlString = "https://api.nytimes.com/svc/topstories/v1/business.json?api-key=f4bf2ee721031a344b84b0449cfdb589:1:73741808"
    guard let url = URL(string: jsonUrlString) else {return}

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data, err == nil else {
            print(err!)
            return
        }

        do {
            let response = try JSONDecoder().decode(TopStoriesResponse.self, from: data)
            print(response.results.first?.title, response.results.first?.abstract)

        } catch let jsonErr {
            print("Error serializing JSON", jsonErr)
        }
    }.resume()
}