Как реализация json-схемы (draft7) должна разрешать `$ ref`s, определенный в неизвестных ключевых словах? - PullRequest
0 голосов
/ 01 декабря 2018

JSON-Schema-Test-Suite определяет схемы, подобные этой, и я предполагаю, что они действительны:

{
    "tilda~field": {"type": "integer"},
    "slash/field": {"type": "integer"},
    "percent%field": {"type": "integer"},
    "properties": {
        "tilda": {"$ref": "#/tilda~0field"},
        "slash": {"$ref": "#/slash~1field"},
        "percent": {"$ref": "#/percent%25field"}
    }
}

Возьмите этот пример ниже:

{
    "$id": "http://example.com/root.json",
    "definitions": {
        "A": { "type": "integer" }
    },
    "properties": {
        "$id": {
            "type": "string"
        },
        "attributes": {
            "$ref": "#/tilda~0field/slash~1field/$id"
        }
    },
    "tilda~field": {
        "$id": "t/inner.json",
        "slash/field": {
            "$id": {
                "$id": "test/b",
                "$ref": "document.json"
            }
        }
    }
}

Какие из следующих*

* 1021 разрешено $ref в #/tilda~0field/slash~1field/$id/$ref* Какой из $id s в #/tilda~0field должен рассматриваться как baseURI для рассматриваемого $ref и почему.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Я только что увидел ваш вопрос на сайте JSON Schema.Я выложу здесь то, что я также там опубликовалОднако, также посмотрите на правку.


Что из следующего является $ref в #/tilda~0field/slash~1field/$id/$ref, разрешенном в?

Я думаю Раздел 8.2 дает ответ: «$ id подсхемы разрешается по базовому URI ее родительской схемы».Это означает, что это будет http://example.com/t/test/document.json.

Какой из $id s в #/tilda~0field должен рассматриваться как baseURI для рассматриваемого $ref и почему.

Базовым URI для этого является $id в корне, перенаправленный на $id in tilda~field.

  1. Начните с http://example.com/root.json.
  2. Измените папки на t и используйте файл inner.json.
  3. Измените папки на test (внутри t) и используйте файл document.json.

РЕДАКТИРОВАТЬ

Взглянув на ответ @ customcommander и осознав, что значение в tilde~field не обрабатывается как схема, я хотел бы сказать, что #ref не будетне обрабатывается вообще.Это просто простая строка JSON без внутреннего значения.

0 голосов
/ 02 декабря 2018

$ref s не разрешены в рамках неизвестных ключевых слов, поскольку $ref и $id применяются только внутри схем.Давайте рассмотрим пример, чтобы понять, что я имею в виду.

{
  "$id": "http://example.com/foo",
  "type": "object",
  "properties": {
    "aaa": {
      "const": { "$ref": "#/definitions/bbb" }
    },
    "bbb": { "$ref": "#/definitions/bbb" }
  },
  "ccc": { "$ref": "#/definitions/bbb" },
  "definitions": {
    "bbb": { "type": "string" }
  }
}
  • Документ в целом является схемой, поэтому /$id понимается схемой JSON.
  • Ключевое слово properties определяется как объект, значения которого являются схемами.Следовательно, значение в /properties/bbb является схемой, а /properties/bbb/$ref понимается схемой JSON.
  • Значение ключевого слова const является неограниченным.Значение в /properties/aaa/const может выглядеть как схема, но это просто обычный объект JSON.Поэтому /properties/aaa/const/$ref не понимается схемой JSON.
  • Значение в /ccc не является ключевым словом JSON Schema, поэтому его значение не ограничено и не является схемой.Поэтому ключевые слова $id и $ref не понимаются схемой JSON.

Вот как это работает сейчас.Когда вы возвращаетесь к более старым черновикам (draft-05 iirc), все немного по-другому.До этого $ref было определено в отдельной спецификации под названием JSON Reference.Схема JSON Расширенная JSON Reference.Следовательно, семантика $ref применяется везде, где она появилась в схеме JSON.

РЕДАКТИРОВАТЬ:

Что происходит, когда $ref внутри известногоключевое слово ссылается на схему глубоко внутри неизвестного ключевого слова.например, что если #/properties/bbb ссылается #/ccc?

Это действительно хороший вопрос.Ссылка #/ccc должна быть ошибкой, поскольку #/ccc не является схемой, а $ref позволяет только ссылаться на схему.

0 голосов
/ 02 декабря 2018

Вы уверены, что ваша вторая схема допустима?

Например, согласно спецификации JSON Schema Core , свойство $id должно быть строкой

Если присутствует, значение для этого ключевого слова ДОЛЖНО быть строкой

Поэтому мне кажется неправильным следующее:

"slash/field": {
  "$id": {
      "$id": "test/b",
      "$ref": "document.json"
  }
}

Тогда я думаю, что ваш первый $refтоже не правильно:

"attributes": {
  "$ref": "#/tilda~0field/slash~1field/$id"
}

Вероятно, следует читать:

"attributes": {
  "$ref": "#/tilda~0field/slash~1field"
}

В том же документе спецификации также говорится о $id и $ref: Cf этот пример

Ключевое слово "$ id" определяет URI для схемы и базовый URI, для которого разрешены другие ссылки URI в схеме.

Или, как просто Ajv :

$ ref разрешается как ссылка на uri с использованием схемы $ id в качестве базового URI […].

Учитывая текущее состояние вашей схемы, я могу только приблизительный ответ на ваш вопрос, но ссылка будетвероятно, решите что-то вроде t/inner.json#document.json

...