Правильная схема 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"]
}
}
}
]
}
4 ответов
Я задал этот же вопрос в JSON schema google group, и на него быстро ответили. Пользователь 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"]
}
}
}
]
}
}
Я тоже давно этим занимаюсь. Но не смогли найти рабочее решение. Он отлично работает, если у вас есть только одна схема, например.
"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. Существует ключевое слово" Type", которое эквивалентно" anyOf " в проекте 4:
таким образом, вы можете использовать
{
"fooBar" : {
"type" : "array",
"items" : {
"type" : [{
"type" : "object",
"properties" : {
"foo" : {
"type" : "string"
}
}
}, {
"type" : "object",
"properties" : {
"bar" : {
"type" : "string"
}
}
}
]
}
}
}
как ответ пользователю 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
]
таким образом, цель совершенно другая из ключевых слов, как "один".