如何将nil属性编码为空JSON对象?
struct Foo: Encodable {
let id = 10
let bar: Bar? = nil
}
struct Bar: Encodable {
let number: Int
}
let data = try! JSONEncoder().encode(Foo())
print(String(data: data, encoding: .utf8)!)这将打印出来:
"{"id":7}"
我想要的是:
"{"id":7, "bar":{}}"
发布于 2021-09-28 05:18:33
我不确定为什么需要这样做,因为对解码失败的表单进行编码通常是不会做的。
尽管如此,如果您发现自己在多个地方需要这种逻辑,您可以使用这种功能扩展KeyedEncodingContainer:
extension KeyedEncodingContainer {
mutating func encodeOptional<T: Encodable>(_ value: T?, forKey key: Self.Key) throws {
if let value = value { try encode(value, forKey: key) }
else { try encode([String:String](), forKey: key) }
}
},然后在Foo中实现encode(to:)方法
struct Foo: Encodable {
let id = 10
let bar: Bar? = nil
enum CodingKeys: String, CodingKey {
case id
case bar
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encodeOptional(bar, forKey: .bar)
}
}如果您发现自己需要在其他类型的容器中为nil值编码空UnkeyedDecodingContainer对象,还可以使用类似的encodeOptional方法扩展JSON和SingleValueDecodingContainer。
发布于 2021-09-27 14:02:01
当为bar = nil时,可以向encoder引入没有属性的空结构
struct Foo: Encodable {
let id = 10
let bar: Bar? = nil
enum CodingKeys : String, CodingKey {
case id
case bar
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
if let bar = bar {
try container.encode(bar, forKey: .bar)
}
else {
try container.encode(Empty(), forKey: .bar)
}
}
}
struct Bar: Encodable {
let number: Int
}
struct Empty: Encodable {
}发布于 2021-09-27 15:16:19
为Foo实现自定义encode(to:),如果Bar为空,则使用空字典
struct Foo: Encodable {
let id = 10
let bar: Bar? = nil
enum CodingKeys: String, CodingKey {
case id, bar
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
switch bar {
case .some(let value):
try container.encode(value, forKey: .bar)
case .none:
try container.encode([String: Bar?](), forKey: .bar)
}
}
}https://stackoverflow.com/questions/69347300
复制相似问题