Ошибка при сериализации JSON "keyNotFound" - PullRequest
0 голосов
/ 10 октября 2018

Я практикую новый способ синтаксического анализа JSON в Swift 4 и использую API-интерфейс New York Times - мне трудно читать структуру JSON, поскольку на странице API просто отображаетсястена текста

Я написал небольшую структуру для данных, которые я хочу получить (заголовки, аннотации):

struct Stories: Decodable {
    let title: String
    let abstract: String
}

и вот функция, которую я вызываю, чтобы получить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))

Так что похоже, что он не находит значения "title".Что я могу сделать по-другому, неправильно настроил Struct?Или я неправильно использую JSONDecorder?

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 10 октября 2018

Проблема в том, что Stories вложены во внешний Dictionary, который вам также необходимо проанализировать.

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()
}
...