SerializedSwift
使用@propertyWrappers 的 Swift 中的基于 GSON 的 JSON 解码策略。
特点
- 无需编写自己的
init(from decoder: Decoder)
- 无需编写自己的 CodingKeys 子类
- 默认支持继承和组合
- 自定义转换类
- 备用编码键
- 如果 JSON 键缺失,则使用默认值
struct Foo: Serializable {
@Serialized
var bar: String
@Serialized("globalId")
var id: String?
@Serialized(alternateKey: "mobileNumber")
var phoneNumber: String?
@Serialized(default: 0)
var score: Int
}
安装
Codoapods
将以下行添加到你的 Podfile
pod 'SerializedSwift'
Swift 包管理器
如果您使用 SPM 作为依赖项管理器,请将以下内容添加到您的 Package.swift
文件中的依赖项
dependencies: [
.package(url: "https://github.com/dejanskledar/SerializedSwift.git")
]
要求
- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
- Xcode 11+
- Swift 5.1+
用法
class User: Serializable {
@Serialized
var name: String
@Serialized("globalId")
var id: String?
@Serialized(alternateKey: "mobileNumber")
var phoneNumber: String?
@Serialized(default: 0)
var score: Int
required init() {}
}
与继承配合工作
不需要额外的解码逻辑
class PowerUser: User {
@Serialized
var powerName: String?
@Serialized(default: 0)
var credit: Int
}
与组合配合工作
不需要额外的解码逻辑
class ChatRoom: Serializable {
@Serialized
var admin: PowerUser?
@Serialized(default: [])
var users: [User]
}
自定义转换器类
您可以创建自己的自定义 Transformable 类,用于自定义转换逻辑。
class DateTransformer: Transformable {
static func transformFromJSON(from value: String?) -> Date? {
let formatter = DateFormatter()
return formatter.date(from: value ?? "")
}
static func transformToJson(from value: Date?) -> String? {
let formatter = DateFormatter()
return formatter.string(from: value ?? Date())
}
}
struct User: Serializable {
@SerializedTransformable<DateTransformer>
var birthDate: Date?
}
功能
Serializable
- 从
SerializableEncodable
和SerializableDecodable
类型别名中进行 - 使用以下属性包装器进行自定义解码和编码
- 将此协议与以下属性包装器结合用于您的类和结构体中
Serialized
- 所有属性(可选和不可选)的序列化属性包装器
- 自定义解码密钥
- 默认情况下使用属性名称作为解码密钥
- 支持替代解码密钥
- 可选默认值(如果密钥缺失)。默认情况下,默认值是
nil
。对于不可选属性,建议提供默认值,以避免崩溃
@Serialized("mainKey", alternativeKey: "backupKey", default: "")
var key: String?
SerializedTransformable
- 自定义转换属性包装器
- 创建自己的 Transformable 类
- 将解码对象转换为自定义类型,如将自定义的 String 日期格式转换为原生的 Date
class DateTransformer: Transformable {
static func transformFromJSON(from value: String?) -> Date? {
let formatter = DateFormatter()
return formatter.date(from: value ?? "")
}
static func transformToJson(from value: Date?) -> String? {
let formatter = DateFormatter()
return formatter.string(from: value ?? "")
}
}
// Usage of `SerializedTransformable`
struct User: Serializable {
@SerializedTransformable<DateTransformer>
var birthDate: Date?
}
贡献
这仅仅是 Property Wrappers ability 的一小部分,以及如何改进 Swift 中的 JSON 解码和编码。欢迎合作。