使用JSONDecoder和Swift将nil转换为空字符串

时间:2018-02-01 13:42:08

标签: swift swift4 jsondecoder

我正在使用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转换为空字符串。先谢谢你。

5 个答案:

答案 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"

}

}