Как я могу проверить JSON по шаблону в JQ?

У меня есть сценарий оболочки. в моем сценарии оболочки у меня есть команда, которая возвращает следующие данные в формате JSON.

{
  "remoteIds": [
    {
      "remoteId": "[fd00:10:244:1:0:0:0:12]--(http://fd00-10-244-1--12.nspace.pod:8080)",
      "requestsReceived": 1
    }
}

я хочу проверить приведенный выше вывод с помощью шаблона json. в моем шаблоне json я могу указать порт, nspace, протокол (http) и RequestReceived. Как я могу разработать шаблон JSON и проверить его на соответствие данным JSON. я могу использовать скрипт jq и bash

Следующее будет шаблоном в моей голове

{
  "remoteIds": [
    {
      "remoteId": "[*]--(http://*.nspace.pod:8080)",
      "requestsReceived": 1
    }
}

Спасибо

Пожалуйста, уточните, какой шаблон вы имеете в виду. Будет ли это соответствовать схеме JSON (json-schema.org)? Если да, подойдет ли один из инструментов проверки схемы JSON?

peak 24.06.2024 01:06

я добавил шаблон, какую бы информацию я не знал, например адрес ipv6, я поместил ее как * в шаблон

Starbucks Admin 24.06.2024 01:09
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы не хотите связываться с полноценной экосистемой определения общих схем и не против «развернуть свой собственный» механизм проверки, вы можете рассмотреть следующую иллюстрацию:

< input.json jq --slurpfile template template.json '
  def validate($template):
    ($template | .remoteIds[0] | keys) as $keys
    | (type == "object") and
      (.remoteIds | type) == "array" and
      all(.remoteIds[]; keys == $keys) and
      all(.remoteIds[].remoteId; 
          test("^\\[.*\\]--[(]http://.*[.]nspace[.]pod:8080[)]$") )
  ;

validate($template[0])
'

Кстати, это работает со всеми тремя основными реализациями jq: стандартная реализация на основе C; гойк; и жак.

Вот как вы можете использовать инструмент проверки JESS для JSON.

(JESS означает расширенные структурные схемы JSON и относится к одновременно язык спецификации схемы и инструмент проверки. Домашняя страница на github находится по адресу https://github.com/pkoppstein/JESS)

Вы можете либо создать схему JESS вручную, либо создайте очень простую структурную схему, как описано ниже, а затем настроить его в соответствии с вашими требованиями. В любом случае, давайте предположим, что ваша структурная схема находится в файле с именем validate.schema и что это выглядит так:

{
  "remoteIds": [
    {
      "remoteId": "/^\\[.*\\]--[(]http://.*[.]nspace[.]pod:8080[)]$/",
      "requestsReceived": "number"
    }
  ]
}

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

Предполагая, что вы установили инструмент проверки JESS, вы можете запустить его следующим образом:

JESS --schema validate.schema input.json

Обратите внимание, что сценарий JESS сообщает только о несоответствиях. То есть он не выдает никаких результатов, если JSON соответствует схеме.


Чтобы автоматически создать базовую структурную схему, вы можете использовать «schema.jq». (https://gist.github.com/pkoppstein/a5abb4ebef3b0f72a6ed) вот так:

< input.json jq 'include "schema" {search: "."}; schema' > validate.schema

Другие вопросы по теме