Сбой с декодированием JSON - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь декодировать ответ JSON из API YouTube в swift.

Информация JSON:

JSON response from youtube playlist info

Я сделал Декодируемую структуру:

// Build a model object to import the JSON data.
struct PlaylistInformation: Decodable {
    struct Items: Decodable {
        struct VideoNumber: Decodable {
            struct Snippet: Decodable {
                let title: String
            }
            let snippet: Snippet
        }
        let videoNumber: VideoNumber
    }
    let items: Items
}

И я получаю ошибку при попытке декодирования:

            // We decode the JSON data get from the url according to the structure we declared above.
        guard let playlistInformation = try? JSONDecoder().decode(PlaylistInformation.self, from: data!) else {
            print("Error: could not decode data into struct") <-- HERE IS THE ERROR
            return
        }

        // Comparing DB Versions.
        let videoTitle = playlistInformation.items.videoNumber.snippet.title as NSString
        print(videoTitle)

Я получаю ошибку:

Error: could not decode data into struct

Iдумаю, это как-то связано с «элементами» в структуре, так как это массив ... но я понятия не имею, как это решить.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Учитывая, что items - это массив, вы должны смоделировать его как массив, а не как структуру:

// Build a model object to import the JSON data.
struct PlaylistInformation: Decodable {
    struct Item: Decodable {
        struct Snippet: Decodable {
            let title: String
        }
        let snippet: Snippet
    }
    let items: [Item]
}

И затем получить доступ к каждому элементу, используя его индекс, например,

let videoTitle = playlistInformation.items[0].snippet.title as NSString
print(videoTitle)
0 голосов
/ 02 мая 2019

Да, ошибка исходила от "элементов" в структуре, так как она является массивом.

Правильная структура Decodable:

    struct PlaylistInformation: Decodable {
    struct Items: Decodable {
        struct Snippet: Decodable {
            struct Thumbnails: Decodable {
                struct High: Decodable {
                    let url: String
                }
                let high: High
            }
            struct ResourceId: Decodable {
                let videoId: String
            }
            let publishedAt: String
            let title: String
            let thumbnails: Thumbnails
            let resourceId: ResourceId
        }
        let snippet: Snippet
    }
    let items: [Items]
}

Спасибо за вашу помощь.

...