【JAVA】使用JSON Schema校验JSON数据是否合规

       相信很多小伙伴现在处理数据交互的时候都喜欢使用JSON,因为它使用方便易读,结构简单,语言无关。但是在使用JSON数据的过程中难免会遇到这样的问题,那就是我要发送/接受的JSON是否满足相应的格式要求。比如这个JSON数据中某个字段我不希望它是null的,某个字段的类型我希望它是Int而不是String。这个时候我们往往就需要对我们将要发送或是收到的JSON数据进行校验,看看这个JSON数据是不是满足我要求的JSON,如果不满足我就要及时捕获到其中不正确的地方。

       今天我们就分享一种非常实用且十分方便进行维护的方法来验证JSON数据是否合规。那就是JSON Schema,其实很多语言都支持的,但是我主要分享的是在JAVA上的使用,如果想了解其他的语言使用的方法,可以直接去官网查看相关的文档,附上地址:http://json-schema.org/implementations.html

      JSON Schema的验证机制很简单,首先你需要维护一份JSON文件,这个文件就是标准的你想要的JSON文件格式,例如:

{
 2   "definitions": {}, 
 3   "$schema": "http://json-schema.org/draft-07/schema#", 
 4   "$id": "http://example.com/root.json", 
 5   "type": "object", 
 6   "title": "The Root Schema", 
 7   "required": [
 8     "checked", 
 9     "dimensions", 
10     "id", 
11     "name", 
12     "price", 
13     "tags"
14   ], 
15   "properties": {
16     "checked": {
18       "type": "boolean"
24     }, 
25     "dimensions": {
27       "type": "object", 
29       "required": [
30         "width", 
31         "height"
32       ], 
33       "properties": {
34         "width": {
36           "type": "integer"
42         }, 
43         "height": {
45           "type": "integer"
51         }
52       }
53     }, 
54     "id": {
56       "type": "integer"
62     }, 
63     "name": {
65       "type": "string"
72     }, 
73     "price": {
75       "type": "number"
81     }, 
82     "tags": {
84       "type": "array", 
86       "items": {
88         "type": "string", 
96       }
97     }
98   }
99 }

这个JSON文件看着是不是会有点晕呢,没关系,你再看看下面这个JSON文件你就知道上面的文件是什么意思了

{
  "checked": false,
  "dimensions": {
    "width": 5,
    "height": 10
  },
  "id": 1,
  "name": "A green door",
  "price": 12.5,
  "tags": [
    "home",
    "green"
  ]
}

其实啊,那份标准的JSON文件呢,就是把你需要的JSON格式描述了出来。其中“type”就是JSON中某个部分或是字段的类型,“title”就是这一部分或是字段的名称可以随意设置的,"required"就是你想要这个JSON中必须有的字段。以后校验的过程,其实就是把拿到的JSON去和这份定义好的标准的JSON文件做比较,如果满足设定呢就是正确的JSON,如果不满足其中的某个设定,例如:其中没有某个要求必存在的字段或者是其中某个字段的类型不对则都会抛出相应的异常。这个“标准的”JSON就类似于一份标准答案的功能。

大家可以自己照着这个格式去写,如果不会写也没关系,有可以自动生成的工具,在这里附上地址:https://jsonschema.net/

有了这个“标准答案”之后我们就可以快速的写一个例子来尝试一下了。首先我们要在pom文件中引入

<dependency>
    <groupId>com.github.everit-org.json-schema</groupId>
    <artifactId>org.everit.json.schema</artifactId>
    <version>1.9.2</version>
</dependency>
...
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

这个是目前最新的版本。大家如果对这个项目感兴趣可以直接去github看,在此附上地址:https://github.com/everit-org/json-schema

之后我们就可以快速开始尝试一下如何验证了。Demo如下:

        //这个就是你设定的标准JSON
        InputStream inputStream = getClass().getResourceAsStream("/Schema.json");
        //这个是你打算验证的JSON,这里我也用一份文件来存放,你也可以使用string或者jsonObject
        InputStream inputStream1 = getClass().getResourceAsStream("/failure.json");
        JSONObject Schema = new JSONObject(new JSONTokener(inputStream));
        JSONObject data = new JSONObject(new JSONTokener(inputStream1));
        Schema schema = SchemaLoader.load(Schema);
        try {
            schema.validate(data);
        } catch (ValidationException e) {
        System.out.println(e.getErrorMessage());

你可以通过修改你打算验证的JSON来尝试看看输出的信息,上手非常简单,大家可以自己试一试,如果有什么疑问,欢迎随时交流。我已经把使用JSON Schema进行验证的机制和简单的例子分享给大家了,大家如果有更多的需求也可以到我文中分享的地址中去看看官方的代码和文档,我就不进行深层次分享了,希望对大家能有帮助。

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 使用 Java 语言编写程序来校验 JSON Schema 是非常容易的,可以使用许多库和框架来帮助您实现它。有许多第三方库和框架可以用于校验 JSON 格式,这些库和框架包括:Jackson,Gson,Genson,Apache Commons,Hibernate Validator,JsonSchemaJsonPath 和 FastJSON。 ### 回答2: 在Java中,可以使用现有的库来编写代码,使用jsonSchema校验数据。下面是使用Java编写的示例代码: 首先,需要导入相关的依赖库,例如使用Jackson库来处理JSON数据使用json-schema-validator库来执行jsonSchema校验。可以通过Maven或Gradle等构建工具来管理依赖。 接下来,创建一个方法来执行校验操作。首先,需要定义jsonSchema的规则,可以使用JSON字符串或从外部文件中加载。然后,需要将待校验数据转换为JSON对象,可以使用Jackson库将字符串解析为JSON对象。 然后,使用json-schema-validator库中的JsonSchemaFactory类来创建JsonSchema实例。使用JsonSchema的validate方法对JSON数据进行校验,该方法会返回校验结果。 最后,根据校验结果进行相应的处理,可以输出校验失败的原因或执行其他操作。 以下是一个简单的示例代码: ```java import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.fge.jsonschema.core.exceptions.ProcessingException; import com.github.fge.jsonschema.core.report.ProcessingReport; import com.github.fge.jsonschema.main.JsonSchema; import com.github.fge.jsonschema.main.JsonSchemaFactory; public class JsonValidator { public static void main(String[] args) { String schema = "{ \"type\": \"object\", \"properties\": { \"name\": { \"type\": \"string\" } } }"; String data = "{ \"name\": \"John\" }"; boolean isValid = validateData(schema, data); if (isValid) { System.out.println("Data is valid."); } else { System.out.println("Data is invalid."); } } public static boolean validateData(String schemaString, String dataString) { ObjectMapper objectMapper = new ObjectMapper(); JsonNode schemaNode, dataNode; try { schemaNode = objectMapper.readTree(schemaString); dataNode = objectMapper.readTree(dataString); } catch (Exception e) { e.printStackTrace(); return false; } JsonSchemaFactory schemaFactory = JsonSchemaFactory.byDefault(); try { JsonSchema schema = schemaFactory.getJsonSchema(schemaNode); ProcessingReport report = schema.validate(dataNode); return report.isSuccess(); } catch (ProcessingException e) { e.printStackTrace(); return false; } } } ``` 以上代码使用了Jackson库将schema数据解析为JSON节点,然后使用json-schema-validator库来创建JsonSchema对象,并使用validate方法进行校验。最后根据校验结果输出相应的信息。 当运行以上代码时,如果数据满足schema的定义,会输出"Data is valid.",否则输出"Data is invalid."。这个示例中使用了简单的schema数据进行校验,实际使用中可以根据需要定义更复杂的schema,并使用更复杂的校验逻辑。 ### 回答3: 使用Java编写可以使用以下步骤来使用jsonSchema校验数据。 首先,你需要引入json-schema-validator库。你可以在Maven或Gradle中添加以下依赖项: 对于Maven: ```xml <dependency> <groupId>org.everit.json</groupId> <artifactId>org.everit.json.schema</artifactId> <version>1.12.1</version> </dependency> ``` 对于Gradle: ```groovy implementation 'org.everit.json:org.everit.json.schema:1.12.1' ``` 接下来,你需要创建一个json schema的字符串或从文件中读取json schema。假设你有以下的json schema字符串: ```json String schemaStr = "{\n" + " \"type\": \"object\",\n" + " \"properties\": {\n" + " \"name\": {\n" + " \"type\": \"string\"\n" + " },\n" + " \"age\": {\n" + " \"type\": \"integer\"\n" + " }\n" + " },\n" + " \"required\": [\"name\", \"age\"]\n" + "}"; ``` 然后你可以使用下面的代码来校验数据: ```java import org.everit.json.schema.Schema; import org.everit.json.schema.ValidationException; import org.everit.json.schema.loader.SchemaLoader; import org.json.JSONObject; import org.json.JSONTokener; class Main { public static void main(String[] args) { String dataStr = "{\"name\":\"John\", \"age\":30}"; try { JSONObject jsonSchema = new JSONObject(new JSONTokener(schemaStr)); JSONObject jsonData = new JSONObject(new JSONTokener(dataStr)); Schema schema = SchemaLoader.load(jsonSchema); schema.validate(jsonData); System.out.println("数据是有效的"); } catch (ValidationException e) { System.out.println("数据无效:" + e.getMessage()); } } } ``` 以上代码将创建一个Schema对象,并使用Schema.validate方法来验证数据。如果数据有效,将输出“数据是有效的”,否则将输出"数据无效"及详细错误信息。 这就是使用Java编写jsonSchema校验数据的基本步骤。你可以根据自己的需求修改json schema数据,并在代码中进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值