title: How to decode JSON with codable in Swift 4?
body: <p>i have a big problem with decoding JSON with Codable</p>
  
  <p>I got the error</p>
  
  <blockquote>
    <p>Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.keyNotFound(SpecieKeys(stringValue: "v", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key SpecieKeys(stringValue: \"v\", intValue: nil) (\"v\").", underlyingError: nil))</p>
  </blockquote>
  
  <p>I spend many time but I don't understand why .. :-(</p>
  
  <p>This is my json</p>
  
  <pre class="lang-swift prettyprint-override"><code>let myJson = """
         [{"i":"4","p":"4","l":["Ail"],"ll":["Allium sativum L."]},
          {"i":"20.1","l":["Artichaut"],"ll":["Cynara cardunculus"]},
          {"i":"XX.3",
           "l":["Tomate cerise"],
           "ll":["Solanum humboldtii"],
           "v":[{"s":1,
                 "i":"0",
                 "l":"Orange Grape Tress",
                 "c":"Orange",
                 "h":992,
                 "ss":12
                }]
  
          }]
      """
      let jsonDATA = myJson.data(using: .utf8)!
  </code></pre>
  
  <p>and my struct</p>
  
  <pre class="lang-swift prettyprint-override"><code>struct Specie : Decodable {
  var id : String?
  var name : [String]?
  var latinName : [String]?
  var varieties : [Variety]?
  
  // keys
  enum SpecieKeys: String, CodingKey {
      case id = "i"
      case name = "l"
      case latinName = "ll"
      case varieties = "v"
  }
  
  struct Variety : Decodable {
      var source : Int?
      var id : String?
      var color : String?
      var name : String?
      var photo : String?
      var harvest : Int?
      var semiShelter : Int?
      var semiOutside : Int?
  
      // keys
      enum VarietyKeys: String, CodingKey {
          case id = "i"
          case source = "s"
          case color = "c"
          case photo = "p"
          case harvest = "h"
          case semiShelter = "ss"
          case semiOutside = "so"
          case name = "l"
      }
  
      init(from decoder: Decoder) throws
      {
          let vValues = try decoder.container(keyedBy: VarietyKeys.self)
          id = try vValues.decode(String.self, forKey: .id)
          source = try vValues.decode(Int.self, forKey: .source)
          name = try vValues.decode(String.self, forKey: .name)
          color = try vValues.decode(String.self, forKey: .color)
          photo = try vValues.decode(String.self, forKey: .photo)
          harvest = try vValues.decode(Int.self, forKey: .harvest)
          semiShelter = try vValues.decode(Int.self, forKey: .semiShelter)
          semiOutside = try vValues.decode(Int.self, forKey: .semiOutside)
      }
  }
  
  init(from decoder: Decoder) throws
  {
      let sValues = try decoder.container(keyedBy: SpecieKeys.self)
      id = try sValues.decode(String.self, forKey: .id)
      name = try sValues.decode(Array&lt;String&gt;.self, forKey: .name)
      latinName = try sValues.decode(Array&lt;String&gt;.self, forKey: .latinName)
      varieties = try sValues.decode(Array&lt;Variety&gt;.self, forKey: .varieties)
  }
  }
  </code></pre>
  
  <p>And the last code</p>
  
  <pre class="lang-swift prettyprint-override"><code>var jsonResult = [Specie]()
  
  jsonResult = try! JSONDecoder().decode(Array&lt;Specie&gt;.self, from: jsonDATA)
  </code></pre>
  
  <p>Someone can help me about my mistake.</p>