MalformedURLException при использовании "$ ref" в схеме json - PullRequest
2 голосов
/ 21 марта 2019

У меня есть схема json, которая ссылается на другую схему json, присутствующую в другой папке, используя «$ ref» (относительный путь), и я получаю «MalformedURLException».

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "#/definitions/Base",
  "definitions": {
    "Base": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "event": {
          "$ref": "com/artifacts/click/ClickSchema.json"
        },
        "arrival_timestamp": {
          "type": "integer",
          "minimum": 0.0
        }
      },
      "title": "Base"
    }
  }
}

А схема щелчка в другой папке выглядит следующим образом:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "com/artifacts/click/ClickSchema.json",
  "Event": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "sourceName": {
        "type": "string"
      }
    }
  }
}

Может кто-нибудь, пожалуйста, помогите. Я использую этот валидатор схемы.

1 Ответ

1 голос
/ 21 марта 2019

Схема JSON ничего не знает о том, где она находится в файле, и ничего о других файлах в папке по умолчанию.

Похоже, используемая вами библиотека распознает это и предлагает вамиспользуйте специальный справочный протокол (classpath), чтобы легко ориентироваться на другие файлы в папке:

https://github.com/everit-org/json-schema#loading-from-the-classpath

По мере роста ваших схем вы захотите разделить их нанесколько исходных файлов и соедините их ссылками "$ ref".Если вы хотите сохранить схемы в classpath (вместо того, чтобы, например, обслуживать их через HTTP), то рекомендуется использовать протокол classpath: для того, чтобы схемы ссылались друг на друга.

Это неЭто не то, что определено схемой JSON.

Более распространенный подход заключается в загрузке всех схем, которые вы собираетесь использовать, и разрешении локального разрешения, когда у вас уже есть файлы.Используемая вами библиотека также поддерживает это: https://github.com/everit-org/json-schema#registering-schemas-by-uri

Иногда полезно работать с предварительно загруженными схемами, которым мы назначаем произвольный URI (возможно, uuid) вместо загрузки схемы черезURL.Это можно сделать, назначив схемы URI с помощью метода #registerSchemaByURI () загрузчика схемы.Пример:

SchemaLoader schemaLoader = SchemaLoader.builder()
        .registerSchemaByURI(new URI("urn:uuid:a773c7a2-1a13-4f6a-a70d-694befe0ce63"), aJSONObject)
        .registerSchemaByURI(new URI("http://example.org"), otherJSONObject)
        .schemaJson(jsonSchema)
        .resolutionScope("classpath://my/schemas/directory/")
        .build();

Есть дополнительные соображения, если вы собираетесь использовать ваши схемы другими.Если это так, оставьте комментарий, и я расширю.

...