title: Swift: ERROR: keyNotFound(CodingKeys(stringValue: "adult", intValue: nil)
body: <p>I do see a lot of similar questions in stack-overflow, but seems no one is similar with my case. I'm new to Combine frame work, and it took me this whole afternoon to figure out what is wrong, however still stuck at here...</p>
  
  <p>Xcode gives me below error, what I do is using TMDB's API and to decode it into my Actor model. And it failed on this line <code>let result = try self.decoder.decode(TMDBActorsResult.self, from: output.data)</code>. Could you give me some hint what is going on with this <code>adult</code>?</p>
  
  <blockquote>
    <p>ERROR: keyNotFound(CodingKeys(stringValue: "adult", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "results", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "knownFor", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"adult\", intValue: nil) (\"adult\").", underlyingError: nil))</p>
  </blockquote>
  
  <p>Also I check the url is working and here is the return data from TMDB API:</p>
  
  <p><a href="https://i.stack.imgur.com/DWA73.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/DWA73.png" alt="enter image description here"></a></p>
  
  <p><a href="https://i.stack.imgur.com/SgnWT.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/SgnWT.png" alt="enter image description here"></a></p>
  
  <p><strong>/// Model for Actor</strong></p>
  
  <pre><code>import SwiftUI
  
  
  struct TMDBActorsResult: Codable {
      let page: Int?
      let results: [Actor]
      let totalResults: Int?
      let totalPages: Int?
  }
  
  struct Actor: Codable {
      let profilePath: String?
      let adult: Bool
      let id: Int?
      let name: String?
      let popularity: CGFloat?
      let knownFor: [Production]?
      let knownForDepartment: String?
      let gender: Int?
  }
  
  // MARK: Used for two objects with media type = (Movie or TV)
  struct Production: Codable {
      let posterPath: String?
      let adult: Bool
      let overview: String?
      let releaseDate: String?
      let originalTitle: String?
      let genreIds: [Int]?
      let id: Int?
      let mediaType: String?
      let originalLanguage: String?
      let title: String?
      let backdropPath: String?
      let popularity: Double?
      let voteCount: Int?
      let video: Bool
      let voteAverage: Double?
      let firstAirDate: String?
      let originCountry: [String]?
      let name: String?
      let originalName: String?
  }
  </code></pre>
  
  <p><strong>/// The JSON decoding part.</strong></p>
  
  <pre><code>import Foundation
  import Combine
  
  enum HTTPError: LocalizedError {
      case statusCode
      case post
  }
  
  struct WebService {
  
      private var decoder: JSONDecoder = {
          let decoder = JSONDecoder()
          decoder.keyDecodingStrategy = .convertFromSnakeCase
          return decoder
      }()
  
      private var session: URLSession = {
          let config = URLSessionConfiguration.default
          config.urlCache = URLCache.shared
          config.waitsForConnectivity = true
          config.requestCachePolicy = .reloadIgnoringLocalCacheData
          return URLSession(configuration: config, delegate: nil, delegateQueue: nil)
      }()
  
      private func createPublisher&lt;T: Codable&gt;(for url: URL) -&gt; AnyPublisher&lt;T, Error&gt; {
          print("Pblisher URL: \(url)")
          return session.dataTaskPublisher(for: url)
              .tryMap { output in
                  guard let response = output.response as? HTTPURLResponse, response.statusCode == 200 else {
                      print("Response: \(output.response)")
  
                      do {
                          let ss = try self.decoder.decode(Response.self, from: output.data)
                          print("ss:  \(ss)")
                      } catch {
                          print(error)
                      }
                      throw HTTPError.statusCode
                  }
  
                  do {
                      let result = try self.decoder.decode(TMDBActorsResult.self, from: output.data)
                      print("Result: \(result)")
                  } catch {
                      print("ERROR: \(error)")
                  }
                  return output.data
              }
              .decode(type: T.self, decoder: decoder)
              .eraseToAnyPublisher()
      }
  
      func getSectionsPublisher() -&gt; AnyPublisher&lt;TMDBActorsResult, Error&gt; {
          createPublisher(for: TMDBClient.Endpoints.popularActors.url).eraseToAnyPublisher()
      }
  
  }
  
  
  </code></pre>
  
  <p>/ / / <strong>Update,</strong> As vadian's comment, I try to modify my data model to using enum associated value, as below code showed, but it gives me error <code>Instance method 'decode(_:forKey:)' requires that 'MediaType' conform to 'Decodable'</code>. I release that the different is that my model is using <code>type</code> in the items but not in the root Media struct.</p>
  
  <pre><code>let jsonString = """
  [{"name": "Popular Movies",
  "description": "Basic movie description",
  "items": [ { "id": 15, "budget": 10, "type": "movies","name": "Sample movie", "movieSPT": ""}]
  },
  {"name": "Popular TV Shows",
  "description": "Basic shows description",
  "items": [ { "id": 15, "adult": false, "type": "tvshows","title": "Sample show", "showSPT": ""}]
  }
  ]
  """
  let data = Data(jsonString.utf8)
  
  
  struct Movie : Decodable {
      let id: Int
      let name, movieSPT: String
      let type: String
      let budget: Int
  }
  
  struct TVShow : Decodable {
      let id: Int
      let title, showSPT: String
      let type: String
      let adult: Bool
  }
  
  enum MediaType {
      case movie([Movie]), tvShow([TVShow])
  }
  
  struct Media : Decodable {
      let name : String
      let description : String
      let items : MediaType
  
      private enum CodingKeys : String, CodingKey { case name, description, type, items }
  
      init(from decoder : Decoder) throws {
          let container = try decoder.container(keyedBy: CodingKeys.self)
          self.name = try container.decode(String.self, forKey: .name)
          self.description = try container.decode(String.self, forKey: .description)
          self.items = try container.decode(MediaType.self, forKey: .items)
          // type = try container.decode(String.self, forKey: .type)
          if items.type == "movies" {
              let movieData = try container.decode([Movie].self, forKey: .items)
              // print("AAA: \(movieData)")
              items = .movie(movieData)
          } else { // add better error handling
              let showData = try container.decode([TVShow].self, forKey: .items)
              items = .tvShow(showData)
          }
  
      }
  }
  
  do {
      let result = try JSONDecoder().decode([Media].self, from: data)
      print(result)
  } catch {
      print(error)
  }
  </code></pre>
  
  <p><strong>Add JSON Data</strong>, <code>known_for</code> is an [object], which object could Movie type or TV type.</p>
  
  <pre><code>{
    "page": 1,
    "total_results": 10000,
    "total_pages": 500,
    "results": [
      {
        "popularity": 57.168,
        "known_for_department": "Acting",
        "name": "Thassapak Hsu",
        "id": 1910848,
        "profile_path": "/1fmjgN8EvDj1TiEJk2Zs4y0T40O.jpg",
        "adult": false,
        "known_for": [
          {
            "original_name": "萌妻食神",
            "genre_ids": [
              35,
              10765,
              10766
            ],
            "media_type": "tv",
            "name": "Cinderella Chef",
            "origin_country": [],
            "vote_count": 5,
            "first_air_date": "2018-04-23",
            "backdrop_path": "/rnzmWKEiWPb8GC1mlqQojj8ccWj.jpg",
            "original_language": "zh",
            "id": 79574,
            "vote_average": 9,
            "overview": "",
            "poster_path": "/xb40Li6ff1BK0pVOxV4lutssCrR.jpg"
          },
          {
            "original_name": "外星女生柴小七",
            "genre_ids": [
              35,
              10765
            ],
            "media_type": "tv",
            "name": "My Girlfriend is an Alien",
            "origin_country": [
              "CN"
            ],
            "vote_count": 2,
            "first_air_date": "2019-08-19",
            "backdrop_path": "/kCl7piWv3pypgYfyLFi7ZgFGlYV.jpg",
            "original_language": "zh",
            "id": 92779,
            "vote_average": 9,
            "overview": "The alien girl Chai Xiaoqi tells the story of Fang Xiaoqi, the overbearing president of the alien girl who died from the \"Cape Town Planet\", who was suffering from the \"rainy weather heterosexual amnesia\". A high-energy hilarious and romantic cross-star love story. The female host Chai Xiaoqi is not only an alien, but also a true-handed witch. Once she inhales the hormones emitted by the males in the earth, she will fall into the \"flowery state\" and suffer from various diseases. The fun and ridiculously ridiculous romance will restore the singularity of the girl in the perfection of the girl. In order to survive on the human earth, Chai Xiaoqi will use his various super powers to solve one accident after another, like a roller coaster. The ups and downs will make the audience hooked. The male lord is cold and is an alternative overbearing president. When it rains, he will forget the opposite sex that appears around him. For this reason, he and the female host will launch various \"fighting and fighting\" laughter dramas. The experience of high sweetness and romance is expected to be Strongly slammed the girl's heart when it was broadcast.",
            "poster_path": "/5e2owvs9TWVsuIacTFxJGPp6KVW.jpg"
          },
          {
            "original_name": "Devil Lover เผลอใจ..ให้นายปีศาจ",
            "id": 74640,
            "media_type": "tv",
            "name": "Devil Lover เผลอใจ..ให้นายปีศาจ",
            "vote_count": 0,
            "vote_average": 0,
            "first_air_date": "2015-10-07",
            "poster_path": "/moThN7iERydEHI2RbfrmhCp69R4.jpg",
            "genre_ids": [
              35
            ],
            "original_language": "th",
            "backdrop_path": "/iRYOwW6DRIRwDYVmRWA8nbfaV2c.jpg",
            "overview": "",
            "origin_country": [
              "TH"
            ]
          }
        ],
        "gender": 2
      },
      {
        "popularity": 39.35,
        "known_for_department": "Acting",
        "gender": 1,
        "id": 2487703,
        "profile_path": "/jRdDoFoHq36hg4kYxxiLa5DRYUW.jpg",
        "adult": false,
        "known_for": [
          {
            "poster_path": "/d9PhCnofBEeQGR3lwywTjWKBiXj.jpg",
            "id": 449924,
            "vote_count": 346,
            "video": false,
            "media_type": "movie",
            "adult": false,
            "backdrop_path": "/ekP6EVxL81lZ4ivcqPsoZ72rY0h.jpg",
            "genre_ids": [
              28,
              18,
              36
            ],
            "original_title": "葉問4",
            "original_language": "cn",
            "title": "Ip Man 4: The Finale",
            "vote_average": 6,
            "overview": "Following the death of his wife, Ip Man travels to San Francisco to ease tensions between the local kung fu masters and his star student, Bruce Lee, while searching for a better future for his son.",
            "release_date": "2019-12-20"
          }
        ],
        "name": "Vanda Lee"
      },
      {
        "popularity": 28.664,
        "known_for_department": "Acting",
        "gender": 1,
        "id": 556435,
        "profile_path": "/5MgWM8pkUiYkj9MEaEpO0Ir1FD9.jpg",
        "adult": false,
        "known_for": [
          {
            "release_date": "2019-05-30",
            "id": 496243,
            "vote_count": 5120,
            "video": false,
            "media_type": "movie",
            "vote_average": 8.6,
            "title": "Parasite",
            "genre_ids": [
              35,
              18,
              53
            ],
            "original_title": "기생충",
            "original_language": "ko",
            "adult": false,
            "backdrop_path": "/TU9NIjwzjoKPwQHoHshkFcQUCG.jpg",
            "overview": "All unemployed, Ki-taek's family takes peculiar interest in the wealthy and glamorous Parks for their livelihood until they get entangled in an unexpected incident.",
            "poster_path": "/7IiTTgloJzvGI1TAYymCfbfl3vT.jpg"
          },
  ....
  </code></pre>