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;
}
}
}