Sourcery-AutoJSONSerializable 2.0.0

Sourcery-AutoJSONSerializable 2.0.0

测试测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2018年2月
SwiftSwift 版本3.0
SPM支持 SPM

Liquidsoul 维护。



  • Sébastien Duperron

Sourcery AutoJSONSerialization

这是我尝试实现一些 Sourcery 模板,用于自动为您的 structclass 生成 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'"
}

功能

  • 原始 JSON 类型(String, Int, Double)。
  • RawRepresentable 枚举。
  • 任何实现 JSONSerializable/JSONDeserializable 的类型。
  • 可选。
  • 嵌套结构。
  • 具有自定义 JSONSerializableJSONDeserializable 实现的嵌套类型。
  • 原始 JSON 类型、枚举和可序列化类型的数组。
  • JSONKey 注释。

⚠️此系统不支持 class 类型,因为扩展只能声明 convenience 初始化器⚠️

⚠️ Date 已不再支持⚠️

因为 几乎所有 项目在与服务器通信时都使用不同的日期格式,内置实现已被移除。您可以通过提供您自己的实现来支持 Date
然而,您仍然可以在测试代码中找到使用具有毫秒支持的 ISO8601DateFormatterDate 序列化/反序列化实现,请参阅 此处

属性注释

在将您的 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
}

自定义 JSON*可实施实例

如果您想嵌套一些不支持的原生类型(例如包含相关值的枚举)或想要为这些类型提供特殊的 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 命令找到所有可能的构建规则。

Pod 部署

我们提供 cocoapods 安装,涉及多个步骤以交付库的新版本。
此过程使用 fastlane 自动化,并且可以使用 make 访问。以下是它将做什么

  1. 增加 podspec 版本并将更改提交到存储库
  2. 创建相应的标签
  3. 将新版本推送到 github 和 cocoapods trunk