JSONSchema

在 Swift 中定义 JSON Schema 的便捷方式。

概述

JSONSchema 提供了一种 Swift 原生的方式来以编程方式定义 JSON Schema 定义。 此软件包利用 Swift 的类型系统来创建清晰、简洁且类型安全的 JSON Schema 定义。

安装

您可以使用 Swift Package Manager 将 JSONSchema 作为依赖项添加到您的项目中,方法是将其添加到 Package.swift 的 dependencies 值中。

dependencies: [
    .package(url: "https://github.com/kevinhermawan/swift-json-schema.git", .upToNextMajor(from: "1.0.0"))
],
targets: [
    .target(
        /// ...
        dependencies: [.product(name: "JSONSchema", package: "swift-json-schema")])
]

或者,在 Xcode 中

  1. 在 Xcode 中打开您的项目。
  2. 点击 File -> Swift Packages -> Add Package Dependency...
  3. 输入仓库 URL:https://github.com/kevinhermawan/swift-json-schema.git
  4. 选择您要添加的版本。您可能想要添加最新版本。
  5. 点击 Add Package

文档

您可以在此处找到文档:https://kevinhermawan.github.io/swift-json-schema/documentation/jsonschema

用法

创建字符串 Schema

import JSONSchema

let emailSchema = JSONSchema.string(
    description: "User's email address",
    pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
)

创建数字 Schema

let priceSchema = JSONSchema.number(
    description: "Product price",
    minimum: 0.01,
    exclusiveMaximum: 1000000
)

创建整数 Schema

let ageSchema = JSONSchema.integer(
    description: "User's age",
    minimum: 0,
    maximum: 120
)

创建枚举 Schema

let statusSchema = JSONSchema.enum(
    description: "User's status",
    values: [
        .string("active"),
        .string("inactive"),
        .string("pending")
    ]
)

创建对象 Schema

let userSchema = JSONSchema.object(
    description: "User object",
    properties: [
        "id": .integer(minimum: 1),
        "name": .string(minLength: 1),
        "email": emailSchema,
        "age": ageSchema,
        "status": statusSchema
    ],
    required: ["id", "name", "email", "status"]
)

创建数组 Schema

let tagsSchema = JSONSchema.array(
    description: "User's tags",
    items: .string(minLength: 1),
    minItems: 1,
    maxItems: 10,
    uniqueItems: true
)

高级用法

对于更复杂的 schema,您可以将 schema 彼此嵌套

let productSchema = JSONSchema.object(
    properties: [
        "id": .integer(minimum: 1),
        "name": .string(minLength: 1, maxLength: 100),
        "price": priceSchema,
        "tags": .array(
            items: .string(),
            uniqueItems: true
        ),
        "settings": .object(
            properties: [
                "inStock": .boolean(),
                "size": .enum(values: [.string("small"), .string("medium"), .string("large")])
            ]
        )
    ],
    required: ["id", "name", "price"]
)

您也可以使用 JSON 字符串创建相同的 schema

do {
    let jsonString = """
    {
        "type": "object",
        "properties": {
            "id": {
                "type": "integer",
                "minimum": 1
            },
            "name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100
            },
            "price": {
                "type": "number",
                "minimum": 0.01,
                "exclusiveMaximum": 1000000
            },
            "tags": {
                "type": "array",
                "items": {
                    "type": "string"
                },
                "uniqueItems": true
            },
            "settings": {
                "type": "object",
                "properties": {
                    "inStock": {
                        "type": "boolean"
                    },
                    "size": {
                        "type": "string",
                        "enum": ["small", "medium", "large"]
                    }
                }
            }
        },
        "required": ["id", "name", "price"]
    }
    """

    let productSchema = try JSONSchema(jsonString: jsonString)
} catch {
    print(String(describing: error))
}

相关软件包

支持

如果您觉得 JSONSchema 有用并希望支持其开发,请考虑捐款。 您的贡献有助于维护项目并开发新功能。

非常感谢您的支持! ❤️

贡献

欢迎贡献!如果您有任何建议或改进,请打开一个 issue 或提交一个 pull request。

许可证

本仓库基于 Apache License 2.0 授权。