Схема JSON отличается для первой строки и отличается для остальных строк - PullRequest
0 голосов
/ 11 октября 2018

моя проблема такова: рассмотрим список из 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 Ответ

0 голосов
/ 16 ноября 2018

Перво-наперво: чего вы хотите достичь с помощью следующего определения схемы?

"first" : [ { ...schema... } ]

Что касается формулировки вашей проблемы, я не уверен, чего вы хотите достичь:

  1. Схема, которая позволяет первому элементу массива быть объектом с 4 ключами, тогда как все остальные элементы должны иметь 5 ключей?

  2. Схема, которая допускает только элементы массива = объектс 5 ключами и отклонит JSON, который имеет 4 ключа в первом элементе

Не могли бы вы перефразировать ваш вопрос, чтобы сделать его более понятным?Я сделал какое-то решение, основываясь на предположениях, но было бы хорошо, если бы вы могли подтвердить мое понимание.

Обязательное чтение

Пожалуйста, прочитайте сначала:

http://json -schema.org / latest / json-schema-validation.html # rfc.section.6.4.1

Если "items" является массивом схем, проверка успешна, если каждый элементэкземпляра проверяется по схеме в той же позиции, если таковая имеется.

плюс https://stackoverflow.com/a/52758108/2811843 по вышеуказанной теме

https://json -schema.org/understanding-json-schema/reference/array.html#length

https://json -schema.org / понимание-json-схема / reference / array.html # tuple-validation

и https://json -schema.org / понимание-json-схема / reference / array.html в целом

, а также

https://json -schema.org / понимание-json-схема / ссылка / object.html # property-names

https://json -schema.org / понимание-json-schema / ссылка / object.htмл # размер

и https://json -schema.org / понимание-json-схема / ссылка / объект.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 - конечный упорядоченный список элементов (последовательность).Да, математика говорит.Используя "предметов": [...] вместо {...} вы падаетев указанный выше раздел спецификации проверки JSON-схемы (http://json -schema.org / latest / json-schema-validation.html # rfc.section.6.4.1 ).

Выше в основном сказано: Это массив, в котором первый элемент должен быть объектом, по крайней мере, с 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».

Решает ли это вашу проблему?

...