Вот ответ JSON:
{
"feed": {
"title": "Top Albums",
"id": "https://rss.itunes.apple.com/api/v1/us/apple-music/top-albums/all/25/explicit.json",
"author": {
"name": "iTunes Store",
"uri": "http://wwww.apple.com/us/itunes/"
},
"links": [
{
"self": "https://rss.itunes.apple.com/api/v1/us/apple-music/top-albums/all/25/explicit.json"
},
{
"alternate": "https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=34&popId=82&app=music"
}
],
"copyright": "Copyright © 2018 Apple Inc. All rights reserved.",
"country": "us",
"icon": "http://itunes.apple.com/favicon.ico",
"updated": "2018-07-17T01:41:38.000-07:00",
"results": [
{
"artistName": "Drake",
"id": "1405365674",
"releaseDate": "2018-06-29",
"name": "Scorpion",
"kind": "album",
"copyright": "℗ 2018 Young Money/Cash Money Records",
"artistId": "271256",
"artistUrl": "https://itunes.apple.com/us/artist/drake/271256?app=music",
"artworkUrl100": "https://is4-ssl.mzstatic.com/image/thumb/Music125/v4/5d/9b/97/5d9b97d6-9f78-e43b-7ba7-c2c42f53a166/00602567879121.rgb.jpg/200x200bb.png",
"genres": [
{
"genreId": "18",
"name": "Hip-Hop/Rap",
"url": "https://itunes.apple.com/us/genre/id18"
},
{
"genreId": "34",
"name": "Music",
"url": "https://itunes.apple.com/us/genre/id34"
}
],
"url": "https://itunes.apple.com/us/album/scorpion/1405365674?app=music"
},
...
И это мой код, который пытается расшифровать указанный выше JSON:
struct object: Decodable {
struct feed: Decodable {
let title: String?
let id: Int?
struct Author: Decodable {
let name: String?
let uri: String?
}
let author: Author?
struct Link: Decodable {
let url: String?
private enum CodingKeys: String, CodingKey {
case url = "self"
}
}
let links: [Link]?
let copyright: String?
let country: String?
let icon: String?
let updated: String?
let results: [Album]?
}
}
struct Album: Decodable {
let artistName: String?
let id: Int?
let releaseDate: String?
let name: String?
let artworkUrl100: String?
let kind: String?
let copyright: String?
let artistId: Int?
let artistUrl: String?
struct Genre: Decodable {
let genreId: Int?
let name: String?
let url: String?
}
let genres: [Genre]?
let url: String?
}
Я пытаюсь получить результаты с названием альбома, именем исполнителя и URL-адресом изображения. Мне трудно понять, как построить подходящую структуру для получения данных с вложенным json.
Когда я пытаюсь получить данные в своем блоке завершения, я просто получаю нулевые значения для всего.
//Networking
let jsonString = "https://rss.itunes.apple.com/api/v1/us/apple-music/top-albums/all/25/explicit.json"
guard let url = URL(string: jsonString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do {
let obj = try JSONDecoder().decode(object.feed.self, from: data)
print(obj)
} catch let jsonError {
print("Error with json", jsonError)
}
}.resume()
И мой результат равен нулю:
feed(title: nil, id: nil, author: nil, links: nil, copyright: nil, country: nil, icon: nil, updated: nil, results: nil)





У вас есть несколько проблем.
Во-первых, самая внешняя структура - это объект под ключом feed.
Тебе нужно:
struct object: Decodable {
let feed: Feed
}
struct Feed: Decodable {
let title: String
let id: String
let author: Author
struct Link: Decodable {
let url: String?
private enum CodingKeys: String, CodingKey {
case url = "self"
}
}
let links: [Link]
let copyright: String
let country: String
let icon: String
let updated: String
let results: [Album]
}
а затем вы бы декодировали его с помощью:
do {
let obj = try JSONDecoder().decode(object.self, from: data)
print(obj)
} catch let jsonError {
print("Error with json", jsonError)
}
Обратите внимание, что все "идентификаторы" относятся к String, а не к Int.
Большое спасибо @ Paulw11, Просто вопрос, почему бы не использовать опциональные параметры для членов структуры? Например, что, если в ленте ответа нет поля автора?
Если вы не знаете, будут ли присутствовать все поля, то да, вам нужны дополнительные параметры. Если они всегда будут присутствовать, то использование опций просто раздражает, потому что вам нужно все время разворачивать. Я думаю, это просто зависит от того, как будет выглядеть JSON.
Никогда не объявляйте все члены структуры схематически как необязательные. В случае ошибки вы получаете значения
nil, и вы не знаете, почему.