gpt4 book ai didi

json - 忽略 Codable 对象中的非 Codable 可选属性

转载 作者:IT王子 更新时间:2023-10-29 05:29:19 26 4
gpt4 key购买 nike

当遵循 Codable 协议(protocol)时,我不能轻易跳过非 Codable 类的可选属性

Ride 结构中,我们希望跳过 driver 属性的编码解码,并保留它 nil 解码时:

  struct Ride: Codable {

public var number: String
public var passenger: Passenger? // Codable conforming
public var driver: Driver? // NSObject subclass, doesn't conform to Codable

enum CodingKeys: String, CodingKey {
case number
case passenger
}
}

在这种情况下我得到一个编译错误

Type 'Driver' does not conform to protocol 'Decodable'

到目前为止,我唯一的解决方案是通过提供以下方法手动编码和解码:

public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
number = try? values.decode(String.self, forKey: .number)
passenger = try? values.decode(Passenger.self, forKey: .passenger)
}

public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(number, forKey: .number)
try container.encode(passenger, forKey: .passenger)
}

还有其他方法可以跳过可选属性吗?对于更大的模型,这会容易得多。

最佳答案

尝试为驱动程序提供一个默认值。例如,在 Xcode 9.0 上编译没有错误:

struct Ride: Codable {
public var number: String
public var passenger: Passenger?
public var driver: Driver? = nil

private enum CodingKeys: String, CodingKey {
case number
case passenger
}
}

struct Passenger: Codable { /* ... */ }

class Driver: NSObject { /* ... */ }

快速测试:

let rideJSON =
"""
{
"number": "123"
}
""".data(using: .utf8)!

let ride = try! JSONDecoder().decode(Ride.self, from: rideJSON)
print(ride) /* Ride(number: "123", passenger: nil, driver: nil) */

顺便说一下,我使用了一个private CodingKeys,因为这也是编译器默认做的;)

关于json - 忽略 Codable 对象中的非 Codable 可选属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46814313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com