Немного заблудился при попытке декодировать объект JSON с несколькими объектами внутри него из вызова API, надеюсь, я смогу получить некоторые рекомендации/примеры того, как это решить. Это объект JSON:
{
"item_info": {
"name": "Example Name",
"movie_image": "https://google.com",
"youtube_trailer": "123",
"description": "lorem ispum",
"backdrop_path": [
"https://google.com"
],
"video": {
"index": 0,
"codec_name": "h264",
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"profile": "High",
},
"audio": {
"index": 1,
"codec_name": "aac",
"codec_long_name": "AAC (Advanced Audio Coding)",
"profile": "LC",
}
},
"movie_data": {
"id": 1,
"name": "Example Name",
"added": "1663373489",
"secondary_id": "298",
}
}
Спасибо за помощь!
Quicktype io для преобразования json в кодируемую модель
справочная статья о том, как анализировать json
Сайт QuickType.io , как предложил Бхагван Ранпура (+1), может дать вам толчок этому. Немного почистив код, вы можете получить что-то вроде:
struct Item: Codable {
let itemInfo: ItemInfo
let movieData: MovieData
}
// MARK: - ItemInfo
struct ItemInfo: Codable {
let name: String
let movieImage: String // possibly `URL` would be more appropriate
let youtubeTrailer, description: String
let backdropPath: [String] // possibly `[URL]` would be more appropriate
let video, audio: Media
}
// MARK: - Media
struct Media: Codable {
let index: Int
let codecName, codecLongName, profile: String
}
// MARK: - MovieData
struct MovieData: Codable, Identifiable {
let id: Int
let name, added, secondaryId: String
}
и затем вы можете расшифровать его:
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let object = try decoder.decode(Item.self, from: data)
print(object)
} catch {
print(error)
}
Обратите внимание, что сайт Quicktype.io предложит явное CodingKeys
сопоставить ключи Snakecase в JSON и соглашение об именах Swifty Camelcase, но этого можно достичь более экономично, указав keyDecodingStrategy
для вашего JSONDecoder
из convertFromSnakeCase
, уменьшив количество шума в код.
Кроме того, глядя на JSON, кажется, что movie_image
и backdrop_path
могут быть типами URL
и [URL]
соответственно, но вам нужно просмотреть документацию по источнику этого JSON, чтобы подтвердить, всегда ли они будут URL-адресами или нет. Аналогично, глядя на короткий JSON, мы не можем быть уверены, должны ли некоторые из этих свойств быть необязательными, поэтому вам снова следует обратиться к документации.
Но, надеюсь, это поможет вам начать.