Схема JSON: внешний файл схемы JSON не проверяет json - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь проверить JSON со схемой JSON, проблема в том, что я создал различные файлы схемы JSON для сложного объекта. Мне нужно включить в основную схему с помощью тега ref. и пытается проверить мой JSON, используя Everit Lib. схема загружена, но когда я пытаюсь проверить мой пример json, он не проверяет внутренний объект схемы.

InnerObject.json

   {
    "$id": "http://example.com/example.json",
    "type": "object",
    "definitions": {},
    "$schema": "http://json-schema.org/draft-07/schema#",
    "properties": {
        "typeCode": {
            "$id": "/properties/typeCode",
            "type": "string"
        },
        "description": {
            "$id": "/properties/description",
            "type": "string"
        },
        "expDate": {
            "$id": "/properties/expDate",
            "type": "string"
        },
        "issuingCountry": {
            "$id": "/properties/issuingCountry",
            "type": "string"
        }
    },
    "required": [
        "typeCode",
        "description",
        "expDate",
        "issuingCountry"
    ]   
}

OuterObject.JSON

    {
    "$id": "http://example.com/example.json",
    "type": "object",
    "definitions": {
    },
    "$schema": "http://json-schema.org/draft-07/schema#",
    "properties": {
        "firstName": {
            "$id": "/properties/firstName",
            "type": "string"
        },
        "lastName": {
            "$id": "/properties/lastName",
            "type": "string"
        },
        "innerObject": {
            "$id": "#item",
            "type": "object",
            "$ref": "file://com/mypack/innerObject.json"
        }
    },
    "required": [
        "firstName",
        "lastName",
        "innerObject"
    ]
}

Оба файла находятся внутри моего проекта src / main / resource

У меня есть класс валидатора json, который используется для проверки моей схемы.

import org.everit.json.schema.Schema;
import org.everit.json.schema.loader.SchemaLoader;
import org.json.JSONObject;
import org.json.JSONTokener;

public class JSONSchemaValidator {
    public static void main(String[] args) {
        JSONObject jsonSchema = new JSONObject(new JSONTokener(JSONSchemaValidator.class
                .getResourceAsStream("/com/schema/outer.schema.json")));
        JSONObject outerJson = new JSONObject();

        JSONObject innerJson = new JSONObject();

        innerJson.put("expDate", "expDate");
        innerJson.put("typeCode", "typeCode");

        outerJson.put("firstName", "firstName");
        outerJson.put("lastName", "lastName");

        outerJson.put("innerObject", innerJson);

        Schema schema = SchemaLoader.load(jsonSchema);

        System.out.println(schema.getDescription());
        schema.validate(outerJson);

        System.out.println("done");

    }
}

Это проверка 1-го уровня с использованием схемы, но не для внутреннего уровня. Кто-нибудь может подсказать, что сделал неправильно, так что это не проверяет JSON.

Пример JSON, который я пытаюсь проверить:

{"firstName":"firstName","lastName":"lastName","innerObject":{"expDate":"expDate","typeCode":"typeCode"}}

Он должен выдать ошибку, так как "typeCode" "description", "expDate", IssueCountry "4 поля являются обязательными, и на входе я передаю только два. Поэтому для оставшихся двух он должен выдать ошибку.

1 Ответ

0 голосов
/ 07 июля 2018

Просто укажите внутренний JSON-файл во внешнем JSON с тегом ref.

например:

{
    "$id": "http://example.com/example.json",
    "type": "object",
    "definitions": {
    },
    "$schema": "http://json-schema.org/draft-07/schema#",
    "properties": {
        "firstName": {
            "$id": "/properties/firstName",
            "type": "string"
        },
        "lastName": {
            "$id": "/properties/lastName",
            "type": "string"
        },
        "innerObject": {                
            "$ref": "innerObject.json"
        }
    },
    "required": [
        "firstName",
        "lastName",
        "innerObject"
    ]
}

В Java-коде вам нужно установить resolutionScope, вам нужно указать путь к вашему внутреннему json.

String path="file:" + Paths.get("").toUri().getPath() + "PATH_OF_YOUR_JSONSchema";
        System.out.println("older"+ path); 
        if (path.contains(" ")) {
             path=path.replaceAll(" ", "%20");           
         }
SchemaLoader sl=SchemaLoader.builder().schemaJson(jsonSchema).resolutionScope(path ).build();
Schema schema=sl.load().build();
schema.validate(yourJsonObject);
...