分享基于 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实现数据结构验证框架

相关推荐
黎明晓月8 小时前
PostgreSQL提取JSON格式的数据(包含提取list指定索引数据)
postgresql·json·list
心死翼未伤17 小时前
python从入门到精通:pyspark实战分析
开发语言·数据结构·python·spark·json
Mephisto.java1 天前
【大数据学习 | flume】flume Sink Processors与拦截器Interceptor
大数据·sql·oracle·sqlite·json·flume
ac-er88881 天前
ThinkPHP中使用ajax接收json数据的方法
前端·ajax·json·php
0x派大星1 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
不能只会打代码2 天前
支持用户注册和登录、发布动态、点赞、评论、私信等功能的社交媒体平台创建!!!
前端·css·后端·html·json·媒体·社交媒体平台
愚公码农2 天前
MySQL json字段索引添加及使用
数据库·mysql·json
拧螺丝专业户2 天前
gin源码阅读(2)请求体中的JSON参数是如何解析的?
前端·json·gin
Mephisto.java2 天前
【大数据学习 | Spark】yarn-client与yarn-cluster的区别
大数据·sql·oracle·spark·json·database
Mephisto.java2 天前
【大数据学习 | Spark】spark-shell开发
大数据·sql·oracle·spark·sqlite·json