JSON Проверка схемы JSON с разными именами свойств - PullRequest
1 голос
/ 05 марта 2020

Я работаю с JSON Схема 4, и у меня возникла проблема, я не могу полностью разобраться. В приведенной ниже схеме вы увидите массив metricsGroups, где любой элемент должен в точности равняться oneOf определенной подсхеме. Внутри подсхем вы заметите, что они оба имеют общее имя свойства timestamp, но metricsGroupOne имеет свойства temperature и humidity, а metricsGroupTwo имеет свойства PIR и CO2. Все свойства в обоих metricsGroups являются обязательными.

Пожалуйста, смотрите схему ниже. Ниже схемы приведен пример некоторых данных, которые я ожидаю проверить, но вместо этого они будут считаться недействительными и объяснение моей проблемы.

{
  "type": "object",
  "properties": {
    "uniqueId": {
      "type": "string"
    },
    "metricsGroups": {
      "type": "array",
      "minItems": 1,
      "items": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "metricsGroupOne": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "properties": {
                    "timestamp": {
                     "type": "string",
                      "format": "date-time"
                    },
                    "temperature": {
                      "type": "number"
                    },
                    "humidity": {
                      "type": "array",
                     "items": {
                        "type": "number"
                      }
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "timestamp",
                    "temperature",
                    "humidity"
                  ]
                }
              }
            },
            "required": [
              "metricsGroupOne"
            ]
          },
          {
            "type": "object",
            "properties": {
              "metricsGroupTwo": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "properties": {
                    "timestamp": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "PIR": {
                      "type": "array",
                      "items": {
                        "type": "number"
                      }
                    },
                    "CO2": {
                      "type": "number"
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "timestamp",
                    "PIR",
                    "CO2"
                  ]
                }
              }
            },
            "required": [
              "metricsGroupTwo"
            ]
          }
        ]
      }
    }
  },
  "additionalProperties": false,
  "required": [
    "uniqueId",
    "metricsGroups"
  ]
}

Вот некоторые данные, которые, по моему мнению, должны быть действительными:

{
  "uniqueId": "d3-52-f8-a1-89-ee",
  "metricsGroups": [
    {
      "metricsGroupOne": [
        {"timestamp": "2020-03-04T12:34:00Z", "temperature": 32.5, "humidity": [45.0] }
      ],
      "metricsGroupTwo": [
        {"timestamp": "2020-03-04T12:34:00Z", "PIR": [16, 20, 7], "CO2": 653.76 }
      ]
    }
  ]
}

Проблема, с которой я сталкиваюсь, заключается в том, что оба массива metricsGroup в моих, как полагают, действительных данных, проверяют обе подсхемы - это затем делает данные недействительными из-за использования oneOf ключевое слово. Я не понимаю, как запись для metricsGroupOne проверяется по схеме для metricsGroupTwo, так как имена свойств различаются, и наоборот.

Я использую библиотеку узлов под капотом, которая выдает эту ошибку, но я также проверил, что такая же ошибка возникает на некоторых веб-сайтах онлайн-проверки:

Любая помощь приветствуется. Спасибо, Адам

1 Ответ

1 голос
/ 05 марта 2020

JSON Схема использует подход, основанный на ограничениях. Если вы не определили, что что-то не разрешено, это разрешено.

Здесь происходит следующее: вы не указали в oneOf[1] ничего, что могло бы сделать первый элемент в вашем массиве данных экземпляра недействительным.

Позвольте мне рассказать об этом на простом примере.

Моя схема. Я собираюсь использовать черновик-07, но нет никакой разницы в этом принципе для черновика-04

{
  "oneOf": [
    {
      "properties": {
        "a": true
      }
    },
    {
      "properties": {
        "b": false
      }
    }
  ]
}

И мой экземпляр:

{
  "a": 1
}

Это не проходит проверку, потому что экземпляр действительно, когда применяются обе схемы oneOf.

Демонстрация: https://jsonschema.dev/s/EfUc4

Если экземпляр находился вместо ...

{
  "a": 1,
  "b": 1
}

Это было бы допустимо, потому что экземпляр не проходит проверку для подсхемы oneOf[1].

Если бы экземпляр был ...

{
  "b": 1
}

Он был бы действительным согласно oneOf[0] но не в соответствии с oneOf[1], и, следовательно, в целом будет действительным, поскольку он действителен только для одной подсхемы.

В вашем случае вам, вероятно, потребуется использовать additionalProperties, чтобы создать свойства, которые вы не определили в properties отказано. Я не могу сказать из вашего вопроса, хотите ли вы разрешить оба свойства, потому что ваша схема определена как oneOf, что, кажется, конфликтует с экземпляром, который вы ожидаете, чтобы быть действительным.

...