分享基于 JSON DSL 实现数据验证框架

简介

在现代应用程序开发中,数据验证是确保数据质量和一致性的重要环节。基于 JSON DSL(领域特定语言)实现的数据验证中间件为开发者提供了一套强大的工具集,旨在简化数据结构的定义和验证过程。此框架不仅支持任意 JSON 格式的自动代码生成,还能够基于 DSL 定义的 schema 来实现数据验证及数据提取。

GitHub - kevinLuan/json-schema-validator: Implement the data structure validation framework based on JSON DSL / 基于JSON DSL实现数据结构验证框架

特点

1. 灵活的 DSL 定义

该中间件允许用户通过简单的 DSL 语法来描述复杂的 JSON 结构。开发者可以轻松定义数据模型,确保数据符合预期格式。例如,用户可以使用直观的语法来定义 JSON 对象、数组、数字和字符串等数据类型。

2. 自动代码生成

通过从 JSON schema 自动生成 Java 类,开发者可以减少手动编码的工作量。这一特性不仅提高了开发效率,还降低了因手动编码而导致的错误风险。只需提供 JSON 数据,该中间件便能生成相应的 Java 代码,帮助开发者快速启动项目。

3. 数据验证

中间件内置了丰富的验证规则,确保数据符合预期格式。开发者可以轻松地对输入数据进行验证,确保其符合定义的 JSON schema。这一功能对于数据的完整性和准确性至关重要。

4. 数据提取

支持从 JSON 文档中提取指定字段,简化数据处理流程。开发者可以快速获取所需数据,避免了繁琐的手动解析过程,从而提高了数据处理的效率。

快速开始

添加依赖

XML 复制代码
<dependency>
    <groupId>cn.taskflow.jsv</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>0.1.5</version>
</dependency>

代码生成

假设我们有以下 JSON 数据:

{

"item": {

"id": 1000,

"orderIds": [1, 2, 3, 4, 5],

"title": "item name"

},

"name": "张三丰",

"age": 60

}

代码生成

java 复制代码
String json = "..."; // JSON 数据
// 使用 json 生成 JSON schema 代码
String javaCode = CodeGenerationUtils.generateSchemaCode(json, new GenerateOptional());
System.out.println(javaCode);

生成后的代码如下:

java 复制代码
JsonSchema jsonSchema = JsonObject.required(
    JsonObject.required("item",
        JsonNumber.required("id"),
        JsonArray.required("orderIds"),
        JsonString.required("title")
    ),
    JsonString.required("name"),
    JsonNumber.required("age")
);

数据验证

使用生成的 JSON schema 进行数据验证非常简单:

java 复制代码
Validator.fromSchema(jsonSchema).validate(json);

基于 Spring 请求 Body 参数验证示例

演示创建订单接口

在电商系统中,创建订单的请求数据结构如下:

{

"orderId": "ORD123456",

"user": {

"userId": "USR78910",

"name": "张三",

"email": "[email protected]",

"phone": "13800000000"

},

"items": [

{

"productId": "PROD001",

"productName": "无线耳机",

"quantity": 2,

"price": 199.99,

"total": 399.98

},

{

"productId": "PROD002",

"productName": "蓝牙音箱",

"quantity": 1,

"price": 299.99,

"total": 299.99

}

],

"totalAmount": 699.97,

"orderDate": "2024-02-04T14:30:00Z",

"status": "PENDING",

"shippingAddress": {

"recipient": "李四",

"addressLine1": "北京市朝阳区某街道",

"addressLine2": "小区1号楼",

"city": "北京",

"state": "北京市",

"postalCode": "100000",

"country": "中国"

},

"payment": {

"method": "CREDIT_CARD",

"transactionId": "TXN123456789",

"amount": 699.97,

"currency": "CNY"

}

}

使用 JSON 生成 Schema 代码

可以使用以下代码生成 Schema:

java 复制代码
CodeGenerationUtils.generateSchemaCode(json, new GenerateOptional());

将生成的 Schema 定义注册到 Spring

在 Spring 中注册生成的 Schema 定义:

java 复制代码
@Bean("orderSchema")
public JsonSchema orderSchema() {
    return JsonObject.required(
        JsonString.required("orderId"),
        JsonObject.required("user",
            JsonString.required("userId"),
            JsonString.required("name"),
            JsonString.required("email"),
            JsonString.required("phone")),
        JsonArray.required("items",
            JsonObject.required(
                JsonString.required("productId"),
                JsonString.required("productName"),
                JsonNumber.required("quantity"),
                JsonNumber.required("price"),
                JsonNumber.required("total"))),
        JsonNumber.required("totalAmount"),
        JsonString.required("orderDate"),
        JsonString.required("status"),
        JsonObject.required("shippingAddress",
            JsonString.required("recipient"),
            JsonString.required("addressLine1"),
            JsonString.required("addressLine2"),
            JsonString.required("city"),
            JsonString.required("state"),
            JsonString.required("postalCode"),
            JsonString.required("country")),
        JsonObject.required("payment",
            JsonString.required("method"),
            JsonString.required("transactionId"),
            JsonNumber.required("amount"),
            JsonString.required("currency")));
}

对 Spring Controller 请求 Body 参数进行验证示例

在 Spring Controller 中进行请求参数验证:

java 复制代码
@PostMapping("/api/test")
public ApiResponse<T> createOrder(@RequestBody @JsonSchemaValidate("orderSchema") Order order) {
    // 省略代码...
}

结论

基于 JSON DSL 的数据验证中间件为开发者提供了一个灵活、高效的工具集,能够简化数据结构的定义和验证过程。通过自动代码生成、丰富的验证规则和数据提取功能,开发者可以更专注于业务逻辑的实现,提高开发效率。无论是简单的验证需求还是复杂的数据处理场景,该中间件都能为开发者提供强有力的支持。

开源项目地址:

GitHub - kevinLuan/json-schema-validator: Implement the data structure validation framework based on JSON DSL / 基于JSON DSL实现数据结构验证框架

相关推荐
CHQIUU4 小时前
在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战
c#·json·.net
i_am_a_div_日积月累_7 小时前
git检查提交分支和package.json的version版本是否一致
git·json
Java Fans15 小时前
WPF使用SQLite与JSON文本文件结合存储体侧平衡数据的设计与实现
sqlite·json·wpf
还不如ctrC+V18 小时前
VScode在 Markdown 编辑器中预览
node.js·json
一个天蝎座 白勺 程序猿1 天前
Python爬虫(8)Python数据存储实战:JSON文件读写与复杂结构化数据处理指南
爬虫·python·json
一路向北he1 天前
pcm数据不支持存储在json里面,需要先转base64
json·pcm
沉迷...3 天前
详解.vscode 下的json .vscode文件夹下各个文件的作用
ide·vscode·json
聪明的墨菲特i3 天前
SQL进阶知识:九、高级数据类型
xml·数据库·sql·mysql·json·空间数据类型
AAA顶置摸鱼3 天前
使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战
json·excel·pandas
冰^4 天前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发