Проверка схемы AJV для объекта с неизвестными свойствами - PullRequest
0 голосов
/ 26 июня 2019

У меня есть забавный сценарий по всей моей платформе, но я считаю, что он лучший.Я пытаюсь проверить схему JSON, где объект имеет неизвестные ключи с той же схемой, что и значение.Ключи являются уникальными идентификаторами, и значения этих ключей имеют одинаковую схему.

Чтобы понять это, позвольте мне объяснить пример кода:

let survey_questions = {
  "vv4sD32": {
    question: "Do you like dogs?",
    answers: ["Yes", "No"]
  },
  "df4sdIU": {
    question: "How about cats?",
    answers: ["Maybe", "Maybe not"]
  },
  "cbkle12": {
    question: "What do you prefer most?",
    answers: ["Dogs", "Cats"]
  }
}

Как вы можете видеть, эта выборка представляет собой опрос, ключом которого является уникальный идентификатор вопроса, изначение является объектом с общей схемой.Я знаю, что мог бы зациклить их и проверить схему для каждого отдельного вопроса, но у меня есть примеры вложенных вещей такого типа, и это сильно усложнит ситуацию.Любые предложения, как это сделать с AJV или любой другой библиотекой?

Спасибо,

Carlino

Ответы [ 2 ]

0 голосов
/ 23 июля 2019

Любые предложения, как сделать это с AJV или любой другой библиотекой?

Вы можете использовать язык расширенной структурной схемы JSON, JESS , который теперь поставляется ссредство проверки соответствия (JESS.jq);для запуска требуется .

В JESS схемы состоят из одного или нескольких текстов JSON.Ваши требования могут быть определены следующей схемой:

[
  "&",
  {
    "forall": ".[]",
    "schema": {
      "question": "string",
      "answer": [
        "string"
      ]
    }
  }
]

Это можно прочитать: для всех значений ключей верхнего уровня убедитесь, что значение является объектом, соответствующим указанному шаблону.

Чтобы определить, является ли ваш survey_questions действительным, вы можете (после установки JESS) использовать скрипт JESS следующим образом:

JESS --schema schema.json survey_questions.json

, где schema.json содержит вышеуказанную схему, а survey_questions.json содержитJSON для проверки.

Примечание: я являюсь автором репозитория JESS.

0 голосов
/ 26 июня 2019

Любые предложения, как это сделать с AJV или любой другой библиотекой?

Если вы открыты для простого подхода, основанного на структурных схемах, тогда, пожалуйста, продолжайте читать.

Программа командной строки может использоваться для проверки схем JSON.

Это можно сделать различными способами.В этом ответе я сосредоточусь на использовании механизма вывода схемы (который я написал), доступного по адресу https://gist.github.com/pkoppstein/a5abb4ebef3b0f72a6ed

. Этот механизм вывода создает простую для чтения схему в форме JSON.документ, который имеет ту же структуру, что и рассматриваемые сущности JSON.

Для иллюстрации давайте сначала предположим:

  • файл с именем survey_questions.json содержит действительный JSON по строкампредложенный объектом «survey_questions» в OP.

  • вышеупомянутый файл schema.jq был загружен в каталог ~ / .jq / schema /

Теперь вызывая jq в командной строке следующим образом:

jq 'include "schema" {"search": "~/.jq"}; [.[]] | schema
' survey_questions.json 

создает предполагаемую структурную схему:

{
  "question": "string",
  "answers": [
    "string"
  ]
}

Это можно прочитать следующим образом: каждый вопрособъект JSON, содержащий не более двух ключей:

  • строковый ключ с именем «question»

  • ключ с именем «answers», которыйэто всегда массив строк.

Обратите внимание на эту схему.jq не делает выводов относительно длины массивов.Чтобы проверить, что каждый массив «ответов» имеет длину не менее 2, нужно будет сделать это отдельно.

Теперь предположим, что мы добавили третье возможное значение, число, к одному из разрешенных «ответов».

Тогда выведенная схема будет выглядеть следующим образом:

{
  "question": "string",
  "answers": [
    "scalar"
  ]
}

Обратите внимание, что answers теперь считается массивом скаляров.

Сводка

В итогеесли предполагаемая схема набора документов или сущностей JSON может быть выражена «структурным» способом, поддерживаемым schema.jq, то проверку схемы можно выполнить путем сравнения выведенной схемы с ожидаемой схемой.

...