Относительный путь проверки схемы java json не работает (URI не найден)

Я смотрю версию кода валидатора 2.2.6 из github. Я не изменил код из репозитория "https://github.com/fge/json-schema-validator.git"

Я не могу запустить пример 1, когда тестирую его на своей схеме json, которая ссылается на второй файл схемы (я могу заставить его работать, когда прибегаю к жестко закодированному URI).

Я просто переназначил "com.github.fge.jsonschema.examples.Example1.java" для использования схемы json моей команды и файлов json. Я построил проект и скопировал файлы схемы json в «json-schema-validator\bin\com\github\fge\jsonschema\examples» (все в одной папке, аналогично примерам fstab)

Секция верхнего уровня прилагается,

               },
                "MovingWindow": {
                    "description": "Is this an moving window measure?",
                    "type": "boolean"
                }
            },
            "minItems": 1,
            "uniqueItems": true
        },
        "RealTimeProfile": {
            "$ref": "rtp.json#"
        }
    },
    "required": [
        "MeasureTemplateId",
        "MeasureInstanceId",

но я не могу получить чтение нижнего уровня, 2-й файл схемы ("rtp.json"), чтобы быть распознанным и работать правильно. Я вижу следующую ошибку:

Исключение в потоке «основной» com.github.fge.jsonschema.core.exceptions.ProcessingException: фатальный: URI «rtp.json#» не является абсолютным уровнем: «фатальный» uri: «rtp.json#»

Фрагмент моего кода:

File jsonFile = new File("CumulativeCountBad.json");
File jsonSchemaFile = new File("main.json");


JsonNode good = JsonLoader.fromFile(jsonFile);
JsonNode mainSchema = JsonLoader.fromFile(jsonSchemaFile);

final JsonSchemaFactory factory = JsonSchemaFactory.byDefault();

final JsonSchema schema = factory.getJsonSchema(mainSchema);

ProcessingReport report;

report = schema.validate(good);
System.out.println("good: " + report);

Моя проблема похожа на следующую проблему, но я, кажется, не могу запустить эту вещь, когда я устанавливаю ссылку на: "$ref": "rtp.json#"

https://github.com/fge/json-schema-validator/issues/94

Любая помощь приветствуется. PS - я новичок в Java, извиняюсь, если есть что-то очевидное, что я пропустил. Спасибо.


person donal    schedule 15.12.2014    source источник


Ответы (3)


Проблема в том, что вы загружаете JSON, а затем превращаете его в схему. И ваша схема не имеет абсолютного URI в «id». Таким образом, это не может работать.

Вы хотите использовать абсолютный URI для их загрузки. Поскольку вы изначально используете File (обратите внимание, что с Java 7+ вы действительно хотите использовать вместо этого java.nio.file), вы можете получить абсолютный URI для него с помощью:

final File jsonSchemaFile = new File("main.json");
final URI uri = jsonSchemaFile.toURI();

Затем вы загружаете схему с помощью:

final JsonSchema schema = factory.getJsonSchema(uri.toString());
person fge    schedule 16.12.2014
comment
Если вы используете Maven, вы можете отформатировать идентификатор следующим образом "id": "resource:/path/to/this/file/within/your/maven/resources/folder/schemaName.json#", См. github.com/java-json-tools/json-schema-validator/issues/125 - person Tadhg; 02.08.2017
comment
но для загрузки таким образом по-прежнему требуется поле идентификатора в схеме? - person Joe Cabezas; 16.02.2018

Я только что изменил свою ссылку со стиля 1: "$ref":"Booking.json" на стиль 2: "$ref":"resource:/booking-schemas/Booking.json"

И это сработало для меня. Можно сгенерировать файлы json для java pojo, используя "$ref":"Booking.json" , но при чтении полезной нагрузки json style1 произойдет сбой. Я просто изменил его на стиль 2, и он работал у меня в обоих сценариях.

person Bhoopendra Dandotiya    schedule 11.04.2021

Обновите файл схемы json с помощью "$id": "/",. После этого изменения схема json будет иметь записи, подобные приведенным ниже:

{ 
   "$schema": "http://json-schema.org/draft-04/schema",
   "$id": "/",
   "title":"Your title",
   "description": "Your description",
   ...
}

Это работает для меня.

person Nandan    schedule 30.07.2021