使用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文件格式,例如:
{ "definitions": {}, "$schema": "http://json-schema.org/draft-07/schema#", "$id": "http://example.com/root.json", "type": "object", "title": "The Root Schema", "required": [ "checked", "dimensions", "id", "name", "price", "tags" ], "properties": { "checked": { "type": "boolean" }, "dimensions": { "type": "object", "required": [ "width", "height" ], "properties": { "width": { "type": "integer" }, "height": { "type": "integer" } } }, "id": { "type": "integer" }, "name": { "type": "string" }, "price": { "type": "number" }, "tags": { "type": "array", "items": { "type": "string", } } }
这个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进行验证的机制和简单的例子分享给大家了,大家如果有更多的需求也可以到我文中分享的地址中去看看官方的代码和文档,我就不进行深层次分享了,希望对大家能有帮助.