JSON Schema - 一種JSON數據的校驗方法

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

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章