SerializedSwift

Swift Package Manager CocoaPods Platforms

一个受 GSON 启发的 Swift JSON 解码策略,使用 @propertyWrappers。

特性

struct Foo: Serializable {
    @Serialized
    var bar: String
    
    @Serialized("globalId")
    var id: String?
    
    @Serialized(alternateKey: "mobileNumber")
    var phoneNumber: String?
    
    @Serialized(default: 0)
    var score: Int
}

安装

CocoaPods

将此行添加到你的 Podfile

pod 'SerializedSwift'

Swift Package Manager

如果你使用 SPM 作为你的依赖管理工具,请将此添加到你的 Package.swift 文件中的依赖项中

dependencies: [
    .package(url: "https://github.com/dejanskledar/SerializedSwift.git")
]

要求

用法

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]
}

自定义 transformer 类

你可以创建自己的自定义 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

Serialized

@Serialized("mainKey", alternativeKey: "backupKey", default: "")
var key: String?

SerializedTransformable

 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 可以实现的功能以及如何改进 Swift 中 JSON 解码和编码的冰山一角。 欢迎合作。