我正在使用Swift 4和JSONDecoder
。我有以下结构:
struct Customer: Codable {
var id: Int!
var cnum: String!
var cname: String!
}
注意:这些字段不能成为可选字段。
现在我有一个JSON字符串:
[
{
"id": 1,
"cnum": "200",
"cname": "Bob Smith"
},
{
"id": 2,
"cnum": "201",
"cname": null
}
]
要解码它,我使用以下内容:
let decoder = JSONDecoder()
let customers = try decoder.decode([Customer].self, from: json)
除了将null数据转换为nil之外,一切正常。我的问题是,将传入的nil转换为空字符串(“”)的最简单方法是什么?
我想用最少的代码执行此操作,但我不确定正确的方法,并且在什么时候可以将nil转换为空字符串。先谢谢你。
答案 0 :(得分:1)
你应该创建一个计算变量,如果它不是nil将具有原始值,如果是,则为空字符串。
var cnameNotNil: String {
return cname ?? ""
}
答案 1 :(得分:1)
您可以使用支持ivars:
struct Customer: Codable {
var id: Int
var cnum: String {
get { return _cnum ?? "" }
set { _cnum = newValue }
}
var cname: String {
get { return _cname ?? "" }
set { _cname = newValue }
}
private var _cnum: String?
private var _cname: String?
private enum CodingKeys: String, CodingKey {
case id, _cnum = "cnum", _cname = "cname"
}
}
由于自定义CodingKeys
,JSON解码器实际上会解码为_cnum
和_cname
,它们是可选字符串。我们在属性getters中将nil转换为空字符串。
答案 2 :(得分:0)
通常的方法是编写一个处理自定义行为的初始化程序。 $()
值会在额外的null
块中捕获。
do - catch
答案 3 :(得分:0)
如果响应中的值可能为空,请使用 decodeIfPresent
cnum = try container.decode(String.self, forKey: .cnum)
cname = try container.decodeIfPresent(String.self, forKey: .cname)
答案 4 :(得分:0)
您可以使用encodeIfPresent方法。
struct来源:可编码{
let id : String?
enum CodingKeys: String, CodingKey {
case id = "id"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decodeIfPresent(String.self, forKey: .id) ?? "Default value pass"
}
}