Search code examples
swiftswift4jsondecoder

Swift 4 JSONDecoder optional variable


I have a Codable struct myObj:

public struct VIO: Codable {

    let id:Int?;
    ...
    var par1:Bool = false; //default to avoid error in parsing
    var par2:Bool = false;    
}

When I do receive JSON, I don't have par1 and par2 since these variables are optional. During parsing I get an error:keyNotFound(CodingKeys(stringValue: \"par1\", intValue: nil)

How to solve this?


Solution

  • If you have local variables you have to specify the CodingKeys

    public struct VIO: Codable {
    
        private enum CodingKeys : String, CodingKey { case id }
    
        let id:Int?
        ...
        var par1:Bool = false
        var par2:Bool = false  
    
    }
    

    Edit:

    If par1 and par2 should be also decoded optionally you have to write a custom initializer

      private enum CodingKeys : String, CodingKey { case id, par1, par2 }
    
       init(from decoder: Decoder) throws {
          let container = try decoder.container(keyedBy: CodingKeys.self)
          id = try container.decode(Int.self, forKey: .id)
          par1 = try container.decodeIfPresent(Bool.self, forKey: .par1)
          par2 = try container.decodeIfPresent(Bool.self, forKey: .par2)
      }
    

    This is Swift: No trailing semicolons