我想用Swift的JSONEncoder
编码一个可选字段,使用符合Encodable
协议的struct
。
默认设置是JSONEncoder
使用encodeIfPresent
方法,这意味着从Json中排除nil
的值。
如何在不编写自定义encode(to encoder: Encoder)
函数的情况下为单个属性覆盖此值?在自定义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}
4条答案
按热度按时间bvjveswy1#
这将在执行main后给予输出:
因此,您可以看到我们对gender进行了编码,因为它在dictionary中为null。
uqxowvwt2#
您可以使用类似的代码来编码单个值。
用法是这样的
sxissh063#
让我建议一个属性 Package 器。
@CodableExplicitNull
用法
给予
svgewumm4#
如果你试图解码这个
JSON
,你信任的JSONDecoder
将创建与这个Playground中示例完全相同的对象:这将打印
所以从“标准”Swift的Angular 来看,你的区别是没有意义的。你当然可以确定它,但道路是棘手的,并通过
JSONSerialization
或[String:Any]
解码的炼狱和更多丑陋的可选项。当然,如果你是服务于另一种语言,你的接口可能是有意义的,但我仍然认为这是一个相当罕见的情况,它很容易值得实现encode(to encoder: Encoder)
,这一点也不难,只是为了澄清你稍微不标准的行为而有点乏味。这对我来说是一个公平的妥协。