Исправить схему JSON для массива элементов различного типа
У меня есть неупорядоченный массив элементов JSON. В соответствии со спецификацией http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.5 приведенная ниже схема json будет проверять только, будут ли объекты в массиве отображаться в этом порядке. Я не хочу указывать порядок, просто проверяйте объекты внутри массива, независимо от порядка или количества объектов. Из спецификации я не могу понять, как это делается.
"transactions" : {
"type" : "array",
"items" : [
{
"type" : "object",
"properties" : {
"type" : {
"type" : "string",
"enum" : ["BUILD", "REASSIGN"]
}
}
},
{
"type" : "object",
"properties" : {
"type" : {
"type" : "string",
"enum" : ["BREAK"]
}
}
}
]
}
Ответы
Ответ 1
Я задал этот же вопрос в группе google group схемы JSON, и на него был дан ответ быстро. Пользователь fge спросил, что я размещаю его ответ здесь:
Здравствуйте,
Текущая спецификация - это проект v4, а не проект v3. Больше в частности, спецификация проверки здесь:
http://tools.ietf.org/html/draft-fge-json-schema-validation-00
Веб-сайт не обновляется, я не знаю, почему... Я отправлю тягу запрос.
С помощью проекта v4 вы можете использовать это:
{
"type": "array",
"items": {
"oneOf": [
{"first": [ "schema", "here" ] },
{"other": [ "schema": "here" ] }
]
}
}
Например, это схема для массива, где элементы могут быть либо строки или целые числа (это может быть написано более простым способом):
{
"type": "array",
"items": {
"oneOf": [
{"type": "string"},
{"type": "integer"}
]
}
}
Это правильный ответ. Моя исправленная схема теперь включает в себя:
"transactions" : {
"type" : "array",
"items" : {
"oneOf" : [
{
"type" : "object",
"properties" : {
"type" : {
"type" : "string",
"enum" : ["BUILD", "REASSIGN"]
}
}
},
{
"type" : "object",
"properties" : {
"type" : {
"type" : "string",
"enum" : ["BREAK"]
}
}
}
]
}
}
Ответ 2
Я тоже занимаюсь этим довольно долго. Но не удалось найти рабочее решение. Он отлично работает, если у вас есть только одна схема, например.
"transactions" : {
"type" : "array",
"items" :
{
"type" : "object",
"properties" : {
"type" : {
"type" : "string",
"enum" : ["BREAK"]
},
}
}
Затем вы просто пропустите скобки массива и используйте объект. Однако, если вы хотите делать то, что вы делаете, похоже, нет твердого ответа. Это единственное, что я нашел до сих пор: http://the-long-dark-tech-time.blogspot.se/2012/12/using-json-schema-with-array-of-mixed.html
Ответ 3
Для всех, кто придерживается схемы 3 проекта. Существует ключевое слово "Тип", которое эквивалентно "anyOf" в черновике 4:
Итак, вы можете использовать
{
"fooBar" : {
"type" : "array",
"items" : {
"type" : [{
"type" : "object",
"properties" : {
"foo" : {
"type" : "string"
}
}
}, {
"type" : "object",
"properties" : {
"bar" : {
"type" : "string"
}
}
}
]
}
}
}
Ответ 4
Как ответ пользователю Vdex: это не эквивалентно, то, что вы написали, означает, что элементы массива встречаются в в этом конкретном порядке внутри массива.
При условии правильной реализации, если вы используете этот валидатор схемы.
С помощью этой схемы:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "array",
"items": [
{
"type": "boolean"
},
{
"type": "number"
},
{
"type": "string"
}
]
}
Этот JSON будет проверен:
[
true,
5,
"a",
"6",
"a",
5.2
]
Но не этот:
[
5,
true,
"a",
"6",
"a",
5.2
]
Таким образом, цель полностью отличается от ключевых слов, таких как "oneOf".