Можете ли вы объявить свою схему JSON ссылкой на тип?

Я пытаюсь проверить небольшой фрагмент JSON, например:

{
    "success": true,
    "message": "all's good!"
}

который работает со схемой:

{
    "type": "object",
    "properties": {
        "success": { "type": "boolean" },
        "message": { "type": "string"  }
    }
}

однако это терпит неудачу со схемой

{
    "definitions": {
        "response": {
            "type": "object",
            "properties": {
                "success": { "type": "boolean" },
                "message": { "type": "string"  }
            }
        }
    },

    "type": { "$ref": "#/definitions/response" }
}

с ошибкой

java.lang.AssertionError: ресурс схемы:/json-schema/sample.schema.json был > недопустим: фатальный: недопустимая схема JSON, не может продолжаться Синтаксические ошибки:

[ {
    "level" : "error",
    "message" : "value has incorrect type (found object, expected one of [array, string])",
    "domain" : "syntax",
    "schema" : {
        "loadingURI" : "resource:/json-schema/sample.schema.json#",
        "pointer" : ""
    },
    "keyword" : "type",
    "found" : "object",
    "expected" : [ "array", "string" ]
} ]

уровень: "фатальный"

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

Если это важно, я использую json-schema-validator версии 2.2.6.


PS - это упрощенный пример, фактическая схема более сложна, чтобы обосновать, почему желательно повторное использование, а не копирование и вставка.


person Sled    schedule 26.10.2016    source источник
comment
Я не понимаю, почему вы должны объявить свой тип верхнего уровня как определение. Можете ли вы чуть более полный пример? Вы можете повторно использовать определения среди свойств и значений свойств.   -  person Adam    schedule 26.10.2016
comment
@AdamRosini У меня есть один вызов, который возвращает ответ, но у меня также есть второй вызов, который выполняет пакетную работу, возвращает карту из 1 идентификатора в ответы. Я хочу повторно использовать объявление ответа. Чтобы иметь возможность повторно использовать определение AFAIK, оно должно быть в определении, или вы можете повторно использовать тип без определения в другом файле?   -  person Sled    schedule 26.10.2016


Ответы (3)


Вы можете использовать "id" и "$ref".

идентификатор для идентификации, например:

{
    "type": "object",
      "id": "#response",
      "properties": {
        "success": { "type": "boolean" },
        "message": { "type": "string"  }
       }
  }
}

И затем вы используете $ref, например:

"some": { "$ref": "#response" }

или внешняя ссылка:

"ext": { "$ref": "http://url.com#response" }

См. http://json-schema.org/latest/json-schema-core.html#anchor27

person Pedro    schedule 26.10.2016

Значение ключевого слова type должно быть строкой имени одного из примитивных типов JSON (например, «строка», «массив» и т. д.) или массивом этих строк. Об этом говорит сообщение об ошибке. Ключевое слово type должно быть строкой или массивом. Самое близкое к тому, что, я думаю, вы пытаетесь сделать, это...

{
    "definitions": {
        "response": {
            "type": "object",
            "properties": {
                "success": { "type": "boolean" },
                "message": { "type": "string"  }
            }
        }
    },
    "allOf": [{ "$ref": "#/definitions/response" }]
}
person Jason Desrosiers    schedule 27.10.2016

Вы должны объявить свое определение в своем собственном файле, и ваши типы ссылаются на эту ссылку на файл. Дополнительные сведения см. в разделе Как управлять несколькими файлами схемы JSON?.

person Adam    schedule 26.10.2016