Swift декодирует объект JSON с несколькими объектами в нем

Немного заблудился при попытке декодировать объект 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",
  }
}

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


1
51
2

Ответы:

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, мы не можем быть уверены, должны ли некоторые из этих свойств быть необязательными, поэтому вам снова следует обратиться к документации.

Но, надеюсь, это поможет вам начать.