分享基于 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": "zhangsan@example.com",

"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实现数据结构验证框架

相关推荐
dingdingfish2 小时前
JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中
oracle·json·database
糖朝4 小时前
c#读取json
c#·json
dingdingfish7 小时前
JSON 系列之2:JSON简单查询
oracle·json·database·19c·23ai
_oP_i13 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
fkdw17 小时前
C# Newtonsoft.Json 反序列化派生类数据丢失问题
c#·json
Kiros_Jiang1 天前
开源低代码平台-Microi吾码 打印引擎使用
javascript·开源·json·.net·pip
nbsaas-boot2 天前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json
疯一样的码农2 天前
Jackson 的@JsonRawValue
json
Web打印2 天前
web打印插件 HttpPrinter 使用半年评测
javascript·json·firefox·jquery·html5
手心里的白日梦2 天前
网络计算器的实现:TCP、守护进程、Json、序列化与反序列化
网络·tcp/ip·json