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

相关推荐
Trouvaille ~10 分钟前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
剩下了什么9 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
梦帮科技15 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
数据知道20 小时前
PostgreSQL实战:详解如何用Python优雅地从PG中存取处理JSON
python·postgresql·json
缘空如是1 天前
基础工具包之JSON 工厂类
java·json·json切换
墨痕诉清风2 天前
CVS文件转Json格式
json·python3·cvs
数研小生2 天前
1688商品列表API:高效触达批发电商海量商品数据的技术方案
大数据·python·算法·信息可视化·json
devmoon2 天前
快速了解兼容 Ethereum 的 JSON-RPC 接口
开发语言·网络·rpc·json·区块链·智能合约·polkadot
九转成圣2 天前
告别肉眼解析!Java 递归实现 JSON 全路径自动化探测工具
java·自动化·json
JQLvopkk2 天前
C# 实现Http Json格式 Post 、Get 方法请求 winform服务器
http·c#·json