Swift 4 JSONDecoder 可选变量
Swift 4 JSONDecoder optional variable
我有一个 Codable
结构 myObj
:
public struct VIO: Codable {
let id:Int?;
...
var par1:Bool = false; //default to avoid error in parsing
var par2:Bool = false;
}
当我收到 JSON 时,我没有 par1
和 par2
,因为这些变量是可选的。在解析过程中出现错误:keyNotFound(CodingKeys(stringValue: \"par1\", intValue: nil)
如何解决?
如果你有局部变量你必须指定 CodingKeys
public struct VIO: Codable {
private enum CodingKeys : String, CodingKey { case id }
let id:Int?
...
var par1:Bool = false
var par2:Bool = false
}
编辑:
如果 par1
和 par2
也应该解码,则您必须编写自定义初始化程序
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)
}
这是Swift:没有尾随分号
我有一个 Codable
结构 myObj
:
public struct VIO: Codable {
let id:Int?;
...
var par1:Bool = false; //default to avoid error in parsing
var par2:Bool = false;
}
当我收到 JSON 时,我没有 par1
和 par2
,因为这些变量是可选的。在解析过程中出现错误:keyNotFound(CodingKeys(stringValue: \"par1\", intValue: nil)
如何解决?
如果你有局部变量你必须指定 CodingKeys
public struct VIO: Codable {
private enum CodingKeys : String, CodingKey { case id }
let id:Int?
...
var par1:Bool = false
var par2:Bool = false
}
编辑:
如果 par1
和 par2
也应该解码,则您必须编写自定义初始化程序
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)
}
这是Swift:没有尾随分号