测试测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2018年2月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✓ |
由 Liquidsoul 维护。
这是我尝试实现一些 Sourcery 模板,用于自动为您的 struct
和 class
生成 JSON 绑定。
我的目标是提供一个经过充分测试的代码生成模板,让您免受编写此代码之苦
extension Contact: JSONDeserializable {
enum Fields: String {
case identifier = "id"
case firstName = "first_name"
case lastName = "last_name"
case age = "age"
}
init?(JSONObject: Any) {
guard let JSONObject = JSONObject as? [String: Any],
let let id = JSONObject[Fields.identifier.rawValue] as? String,
let firstName = JSONObject[Fields.firstName.rawValue] as? String,
let lastName = JSONObject[Fields.lastName.rawValue] as? String,
let age = JSONObject[Fields.age.rawValue] as? Int
else {
return nil
}
self.id = id
self.firstName = firstName
self.lastName = lastName
self.age = age
}
}
JSON 序列化和反序列化依赖于两个协议。
protocol JSONDeserializable {
init?(JSONObject: Any)
}
protocol JSONSerializable {
func toJSONObject() -> Any
}
使用此工具,您不需要实现这些协议,Sourcery 模板将为您生成样板代码。
为此,您只需要将 sourcery 注释添加到您的 struct
中
// sourcery: AutoJSONSerializable, AutoJSONDeserializable
struct Contact {
// ...
}
然后使用该仓库中 Templates/
文件夹中找到的模板运行 Sourcery。
假设您有一个这样的模型 struct
struct Contact {
let id: String
let firstName: String
let lastName: String
let age: Int
}
添加 AutoJSONDeserializable
注释将该结构初始化为以下 JSON 数据
{
"id": "SomeID",
"firstName": "John",
"lastName": "Doe'"
}
RawRepresentable
枚举。JSONSerializable
/JSONDeserializable
的类型。JSONSerializable
或 JSONDeserializable
实现的嵌套类型。class
类型,因为扩展只能声明 convenience
初始化器
Date
已不再支持
因为 几乎所有 项目在与服务器通信时都使用不同的日期格式,内置实现已被移除。您可以通过提供您自己的实现来支持 Date
。
然而,您仍然可以在测试代码中找到使用具有毫秒支持的 ISO8601DateFormatter
的 Date
序列化/反序列化实现,请参阅 此处。
在将您的 JSON 映射到模型结构时,您有时可能希望使用与 JSON 文件中不同的属性名。
比如说,您有以下的 JSON
{
"id": "SomeID",
"first_name": "John",
"last_name": "Doe'"
}
如您所见,命名约定并不遵循驼峰命名法。要修复此问题,您可以使用 Sourcery 注释。
在某个属性上,您可以使用您想将属性绑定到的 JSON 名称定义 JSONKey
属性。
struct Contact {
let id: String
// sourcery: JSONKey = "first_name"
let firstName: String
// sourcery: JSONKey = "last_name"
let lastName: String
}
如果您想嵌套一些不支持的原生类型(例如包含相关值的枚举)或想要为这些类型提供特殊的 serde 方法实现,您只需实现 JSONSerializable
和/或 JSONDeserializable
协议。
例如,如果 Job
是一个枚举,您仍然可以将其添加到 Contact
中
struct Contact {
let id: String
let job: Job
}
enum Job: JSONSerializable {
[…]
func toJSONObject() -> Any {
// Implemnt your custom serializer.
}
}
您可以在 Sources/AutoJSONSerialization/Models/ 的竹叶模型中找到一些示例。
要安装,只需将以下源文件复制到您的项目中
Sources/AutoJSONSerialization/JSONSerializable.swift
Sources/AutoJSONSerialization/JSONDeserializable.swift
然后复制模板文件并配置 Sourcery。
此库使用 Swift 包管理器通过一个使用 Makefile
描述的 Sourcery 预构建步骤来构建代码。
您可以使用 make help
命令找到所有可能的构建规则。
我们提供 cocoapods 安装,涉及多个步骤以交付库的新版本。
此过程使用 fastlane
自动化,并且可以使用 make
访问。以下是它将做什么
cocoapods
trunk