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
一起使用时的以下类型
Decimal
URL
Data
Date
为了保持一致性并避免意外结果,请始终在代理编码器/解码器中包含这些类型的策略。 方便的是,所有这些策略都捆绑在 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 文件。
始终欢迎贡献! 请参阅我们的贡献指南。