Схема JSON отличается для первой строки и отличается для остальных строк
Моя постановка проблемы: рассмотрим список из 15 строк, все строки должны иметь 5 ключей. Однако только 0-й ряд будет иметь 4 ключа. Но все оставшиеся строки будут иметь все 5 ключей.
Я хочу подтвердить это снова мой ответ. Действительно ли первое и другое ключевое слово существуют.
Я нашел это здесь Правильная схема JSON для массива элементов разного типа
Пример схемы
{
"type": "array",
"items": {
"oneOf": [
{
"first": [{
"type": "object",
"required": ["state"],
"properties":{
"state":{
"type":"string"
}
}
}]
},
{
"other": [{
"type": "object",
"required": ["state", "zip"],
"properties":{
"state":{
"type":"string"
},
"zip":{
"type":"string"
}
}
}]
}
]
}
}
1 ответ
Перво-наперво: чего вы хотите достичь с помощью следующего определения схемы?
"first" : [ { ...schema... } ]
Что касается постановки вашей проблемы, я не уверен, чего вы хотите достичь:
Схема, которая позволяет первому элементу массива быть объектом с 4 ключами, тогда как все остальные элементы должны иметь 5 ключей?
Схема, которая допускает только массив элементов = объект с 5 ключами и будет отклонять JSON, который имеет 4 ключа в первом элементе
Не могли бы вы перефразировать ваш вопрос, чтобы сделать его более понятным? Я сделал какое-то решение, основываясь на предположениях, но было бы хорошо, если бы вы могли подтвердить мое понимание.
Требуется чтение
Пожалуйста, прочитайте сначала через:
http://json-schema.org/latest/json-schema-validation.html
Если "items" является массивом схем, проверка завершается успешно, если каждый элемент экземпляра проверяется по схеме в той же позиции, если таковая имеется.
плюс /questions/39098736/kak-ubrat-zavisimosti-poryadka-v-sheme-json-v-sluchae-massiva-obektov/39098742#39098742 по вышеуказанной теме
https://json-schema.org/understanding-json-schema/reference/array.html
https://json-schema.org/understanding-json-schema/reference/array.html
и https://json-schema.org/understanding-json-schema/reference/array.html в целом
так же как
https://json-schema.org/understanding-json-schema/reference/object.html
https://json-schema.org/understanding-json-schema/reference/object.html
и https://json-schema.org/understanding-json-schema/reference/object.html в целом.
Возможное решение
Посмотрев пример схемы, я перефразирую формулировку задачи, сделав несколько диких предположений, что вам нужна схема, которая допускает массив элементов, где item = object. Первый элемент может иметь 4 ключа, а все остальные элементы должны иметь 5 ключей.
Мне нужна схема JSON, которая будет описывать массив объектов, где первый объект всегда имеет 4 ключа / свойства, в то время как все остальные объекты имеют 5 ключей / свойств.
Кроме того, в массиве всегда есть хотя бы первый элемент (содержащий 4 ключа), а в массиве может быть до X других объектов (содержащих 5 ключей).
Перейти к типизации Tuple и массив объектов. Таким образом, вы можете точно проверить, что первый элемент (объект) имеет ровно 4 свойства и определить схему для остальных из них.
Во-первых, полная рабочая схема (с комментариями внутри). Раздел "examples" содержит примеры массивов для иллюстрации логики, только последние 3 будут действительны для схемы.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"$comment" : "This is an array, where first item must be an object with at least 4 properties and one property named \"state\" and can contain minimum 1 and maximum of 3 items",
"minItems" : 1,
"maxItems" : 3,
"items": [
{
"type": "object",
"minProperties" : 4,
"required" : ["state"],
}
],
"additionalItems" : {
"$comment" : "Any additional item in this array must be an object with at least 5 keys and two of them must be \"state\" and \"zip\".",
"type" : "object",
"minProperties" : 5,
"required" : ["state", "zip"],
},
"examples" : [
[
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
},
{},
{}
],
[
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "12345"
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
}
],
[
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "12345"
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "54321"
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "54321"
}
],
[],
[
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "12345"
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "54321"
},
],
[
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
},
],
[
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
},
{
"key1" : "1",
"key2" : "2",
"key3" : "3",
"state" : "some state",
"zip" : "12345"
},
]
]
}
Итак, шаг за шагом:
"type": "array",
"minItems" : 1,
"maxItems" : 3,
JSON, который является массивом с минимум 1 элементом, максимум 3 элементами, будет в порядке. Если вы не определите значение "minItems", пустой массив пройдет проверку по схеме.
"items": [
{
"type": "object",
"minProperties" : 4,
"required" : ["state"],
}
],
Это магия Tuple - конечный упорядоченный список элементов (последовательность). Да, математика говорит. Используя "items": [...] вместо { ... }, вы попадаете в приведенный выше раздел спецификации проверки JSON ( http://json-schema.org/latest/json-schema-validation.html).
Выше в основном сказано: Это массив, где первый элемент должен быть объектом как минимум с 4 ключами, и один из этих ключей должен быть "состоянием".
Хорошо, последнее, но не менее важное:
"additionalItems" : {
"$comment" : "Any additional item in this array must be an object with at least 5 keys and two of them must be \"state\" and \"zip\".",
"type" : "object",
"minProperties" : 5,
"required" : ["state", "zip"],
}
Этим я сказал: в этом массиве (который должен иметь первый элемент, объект с 4 ключами, и один из этих ключей является "состоянием", и, кстати, массив должен иметь как минимум 1 элемент и не более 3 элементов), вы можете добавьте дополнительные элементы к тем, которые уже определены в разделе "элементы". Каждый такой дополнительный элемент должен быть объектом как минимум с 5 ключами, из которых два должны быть "state" и "zip".
Это решает вашу проблему?