Указание объекта должно быть пустым, если другой объект имеет свойства в схеме JSON. - PullRequest
1 голос
/ 06 мая 2020

У меня есть данные, которые возвращаются из GraphQL, я хотел бы проверить эти данные с помощью схемы JSON, прежде чем манипулировать ими.

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

например, упрощенная версия данных

obj: {
  audio: {
    artists: []
  },
  video: {}
}

или

obj: {
  audio: {},
  video: {
    artists: []
  }
}

Итак действительность будет:

  • объект со свойством audio и video
  • объект с audio как объект со свойством artists и пустым свойство video объект
  • объект с video как объект со свойством artists и пустым свойством audio объект
  • ни audio, ни video не должны быть вместе пустые
  • ни audio, ни video не должны иметь свойства вместе

Я построил упрощенную схему, которая выглядит так:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "file://schemas/simple.schema.json",
  "title": "simplified data",
  "description": "simple",
  "type": "object",
  "properties": {
    "audio": {
      "type": "object"
    },
    "video": {
      "type": "object"
    }
  },
  "oneOf": [
    {
      "audio": {
        "type": "object",
        "properties": {
          "artists": {
            "type": "array"
          }
        }
      },
      "video": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "audio": {
        "type": "object",
        "properties": {}
      },
      "video": {
        "type": "object",
        "properties": {
          "artists": {
            "type": "array"
          }
        }
      }
    }
  ]
}

но AJV, похоже, не проверяет данные правильно при запуске с:

{
  "audio": {
    "artists": []
  },
  "video": {}
}

Что может иметь Я ошибся в схеме?

1 Ответ

3 голосов
/ 06 мая 2020

После первой попытки Джейсон указал на более простое решение ...

Используя oneOf, вы можете указать, что только один из объектов может иметь хотя бы одно свойство.

Вы можете проверить это здесь: https://jsonschema.dev/s/SSRaL

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "file://schemas/simple.schema.json",
  "properties": {
    "audio": {
      "type": [
        "object"
      ],
      "properties": {
        "artists": {
          "$comment": "whatever validation you want"
        }
      }
    },
    "video": {
      "type": [
        "object"
      ],
      "properties": {
        "artists": {
          "$comment": "whatever validation you want"
        }
      }
    }
  },
  "oneOf": [
    {
      "properties": {
        "video": {
          "minProperties": 1
        }
      }
    },
    {
      "properties": {
        "audio": {
          "minProperties": 1
        }
      }
    }
  ]
}
...