【发布时间】:2018-04-27 16:26:16
【问题描述】:
我想使用符合Encodable 协议的struct 使用Swift 的JSONEncoder 对可选字段进行编码。
默认设置是JSONEncoder 使用encodeIfPresent 方法,这意味着nil 的值被排除在Json 之外。
如何在不编写我的自定义 encode(to encoder: Encoder) 函数的情况下为单个属性覆盖它,我必须在其中实现所有属性的编码(如 this article 在“自定义编码”下建议)?
例子:
struct MyStruct: Encodable {
let id: Int
let date: Date?
}
let myStruct = MyStruct(id: 10, date: nil)
let jsonData = try JSONEncoder().encode(myStruct)
print(String(data: jsonData, encoding: .utf8)!) // {"id":10}
【问题讨论】:
-
相关问题,但改用自定义编码逻辑:stackoverflow.com/questions/47266862/…
-
您到底想达到什么目的?哈希中的
JSON条目,例如"date": null;?您打算通过明确表达null来传达什么不同?如果您打算使用 Swift 来使用结果,那么一开始您将很难分辨出其中的差异。您的链接似乎是对encodeIfPresent的唯一值得注意的参考,但这种情况似乎非常罕见,值得实施encode(to encoder: Encoder)。 -
我的 API 通过显式设置
null来重置值。而且根据我的经验,这种情况并不罕见...... -
如果不实现您自己的
encode,我认为这是不可能的。 (您需要覆盖的 JSONEncoder 部分是fileprivate。)如果实现起来并不简单,我建议您使用 SwiftGen 来编写它;这应该很容易在 SwiftGen 中构建。通常,不可能获得半定制的 Encodables。有少量非常具体的配置点,但除此之外,它目前是默认的或自定义的。我希望这会有所改善。
标签: ios json swift encoding codable