CodableProxies 为 Swift 的 Codable 类型提供了强大的编码和解码策略。 通过将你的编码器和解码器包装在 DecoderProxy 和 EncoderProxy 中,你可以轻松应用这些策略,从而获得更灵活和通用的编码/解码体验。
struct User: Codable {
let isActive: Bool
let birthDate: Date
...
}
let userJSON = """
{
"isActive": "yes",
"birthDate": "1990-01-01T00:00:00Z",
...
}
"""
let decoder = DecoderProxy(JSONDecoder(), strategy: [.default, .Bool.string, .Date.iso8601])
let user = try decoder.decode(User.self, from: userJSON.data(using: .utf8)!)
包装你的编码器和解码器
let encoder = EncoderProxy(JSONEncoder(), strategy: [.Bool.string, .Date.iso8601])
let decoder = DecoderProxy(JSONDecoder(), strategy: [.Bool.string, .Date.iso8601])
.Bool: decodeFromString, string..Data: base64..Date: date, iso8601, formatted(formatter:), timestamp..Decimal: string, number..Keys: useDefaultKeys, snakeCase, camelCase, custom(...)..Numeric: string..Optional: encodeNull..URL: uri.该库提供了 CodingProxy 和 CodingStrategy,它们将编码和解码结合在一起,以实现对称操作。
设置多个策略时,编码和解码之间的行为有所不同
如果为同一类型组合了多个编码策略,则只会应用最后指定的策略。 较早指定的策略将被覆盖。
示例: 使用 [.Date.iso8601, .Date.timestamp] 进行编码将导致日期被编码为时间戳,因为 .Date.timestamp 是最后列出的策略。
对于解码,如果为同一类型指定了多个策略,将按提供的顺序尝试所有策略。 如果任何策略成功,解码都将成功。 如果所有自定义策略都失败,则解码器的原始策略将用作回退。
示例: 对于 [.Date.iso8601, .Date.timestamp] 的解码,代理将首先尝试以 ISO8601 格式解码日期。 如果失败,它将尝试将其解码为时间戳。 如果两种策略都失败,则将使用解码器的原始策略解码日期。
使用 CodableProxies 时,必须了解该库将覆盖并忽略原始编码器/解码器上设置的任何自定义编码和解码策略。 此行为特别影响与 JSONEncoder、JSONDecoder、PropertyListEncoder 和 PropertyListDecoder 一起使用时的以下类型
DecimalURLDataDate为了保持一致性并避免意外结果,请始终在代理编码器/解码器中包含这些类型的策略。 方便的是,所有这些策略都捆绑在 EncoderStrategy.default 和 DecoderStrategy.default 中。
EncodingStrategy.print。.Collection.nilIfEmpty 和 .Collection.emptyIfNil 之类的策略,以更好地管理集合状态。创建一个 Package.swift 文件。
// swift-tools-version:5.7
import PackageDescription
let package = Package(
name: "SomeProject",
dependencies: [
.package(url: "https://github.com/dankinsoid/CodableProxies.git", from: "1.1.3")
],
targets: [
.target(name: "SomeProject", dependencies: ["CodableProxies"])
]
)
$ swift build
dankinsoid, voidilov@gmail.com
CodableProxies 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。
始终欢迎贡献! 请参阅我们的贡献指南。