1. 说明
JSON Schema本身也是一个JSON,它规定了其他JSON数据的结构,包括:哪些是必选字段,字段类型是什么,字段内容取值是什么,数组元素个数的最大最小值等等
简单来说,JSON Schema是一系列规则组成的JSON,这些规则规定了JSON数据应该是什么样的格式
将JSON数据与JSON Schema进行比较,就可以知道JSON数据是否满足条件。由此,我们可以用JSON Schema来校验JSON格式的接口返回报文是否合格
实际应用中,我是用Java来实现校验的,引用的jar包是:org.json
2. JSON Schema示例
{
"$schema": "http://json-schema.org/draft-06/schema#",
"definitions": {
"address": {
"properties": {
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"street_address": {
"type": "string"
}
},
"required": [
"street_address",
"city",
"state"
],
"type": "object"
}
},
"properties": {
"billing_address": {
"$ref": "#/definitions/address"
},
"shipping_address": {
"$ref": "#/definitions/address"
}
},
"type": "object"
}
如上就是一个简单的JSON Schema示例,关于JSON Schema更详细的内容,可以参考:
https://json-schema.org/understanding-json-schema/index.html
3. maven引入jar包
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
4. 校验逻辑示例
package com.alibaba.campaign.util;
import org.everit.json.schema.Schema;
import org.everit.json.schema.ValidationException;
import org.everit.json.schema.loader.SchemaLoader;
import org.everit.json.schema.regexp.RE2JRegexpFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
public class JSONUtil {
public static final String VALIDATE_RESULT = "validateResult";
public static final String VALIDATE_MESSAGE = "message";
public static final String VALIDATE_SUCCESS = "SUCCESS";
public static final String VALIDATE_FAILED = "FAILED";
/**
* @param jsonString - The string which to be validate
* @return true - if the string is valid json
* false - if the string is NOT valid json
*/
public static boolean isStringValidJSON(String jsonString) {
try {
new JSONObject(jsonString);
} catch (JSONException e) {
return false;
}
return true;
}
/**
* @param schema - Json schema
* @param jsonObject - The JSON object which will be validated
* @return A JSON object which contains validate result and message
*/
public static JSONObject validateJSONWithSchema(String schema, JSONObject jsonObject) {
JSONObject resultObject = new JSONObject();
if (null == schema || !isStringValidJSON(schema)) {
resultObject.put(VALIDATE_RESULT, VALIDATE_FAILED);
resultObject.put(VALIDATE_MESSAGE, "The inputted json schema is invalid, please check!");
return resultObject;
}
if (null == jsonObject) {
resultObject.put(VALIDATE_RESULT, VALIDATE_FAILED);
resultObject.put(VALIDATE_MESSAGE, "The inputted json object is null, please check!");
return resultObject;
}
JSONObject schemaObject = new JSONObject(new JSONTokener(schema));
Schema jsonSchema = SchemaLoader.builder()
.regexpFactory(new RE2JRegexpFactory())
.schemaJson(schemaObject).build().load().build();
try {
jsonSchema.validate(jsonObject);
resultObject.put(VALIDATE_RESULT, VALIDATE_SUCCESS);
resultObject.put(VALIDATE_MESSAGE, "Validate is success!");
} catch (ValidationException e) {
resultObject = e.toJSON();
resultObject.put(VALIDATE_RESULT, VALIDATE_FAILED);
} finally {
return resultObject;
}
}
}