Как проверить json, чтобы убедиться, что каждый объект json действителен?

Есть несколько слоев, в которых вы можете запросить последнюю команду.

Редактор строки

Строковый редактор (, в котором вы вводите свои команды ), предоставляется непосредственно ksh, библиотекой readline в bash и библиотекой zle в zsh. Другие оболочки, такие как dash, могут не иметь библиотеки редактирования для понимания этих клавиш (, если они не скомпилированы с включенной опцией --with-libedit).

Эта работа в ksh, bash, zsh:

Ctrl-P#Режим Emacs (предыдущий)
Ctrl-N#Режим Emacs (далее)
ESC-k#режим vi ESC для перехода в командный режим и k для перехода вверх
ESC-j#режим vi ESC для перехода в командный режим и j для перехода вниз

история

Система истории, предоставляемая многими оболочками, позволяет расширять некоторые ярлыки:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

команды

Есть некоторые команды, которые могут извлекать команды из истории.

Подобно довольно подробной команде (, только для печати):

history 2 | head -n-1

или старая и поэтому обычно более переносимая fcкоманда (непосредственно повторно -выполняется):

fc -e - -1

Или проще fc -s -1, но zsh не принимает такой вариант для fc.

Если вы хотите только напечатать команду, используйте:fc -nl -1 -1.

Для редактирования установите FCEDITтекстовый редактор (ex, ed, emacs, vi и т. д. )и используйте fc напрямую:fc -1.

0
21.11.2020, 23:51
1 ответ

Проверка уникальности значений

Если я хочу выполнить быструю проверку уникальности всех объектов в массиве clientId, я бы использовал jqтолько для вывода этого значения и проверки в оболочке.

< file.json jq '.rootLevel[].clientId' | awk '
    seen[$0]++ {print "FAILURE"; f=1; exit}
    END {if (!f) print "SUCCESS"}'

Вы также можете сделать это с jq, комбинируя length, unique, unique_byили другие функции, man jqдля большего.

Печатать только дубликаты

Если вы хотите напечатать все объекты, имеющие дубликаты .clientId, вы можете сделать это:

jq '.rootLevel | group_by(.clientId) | map(select(length>1))' file.json

group_byсоздаст отдельные массивы на clientId, и мы выберем только те, у которых более одного элемента, то есть те, которые дублируют clientId. Или вы можете добавить функцию длины для их подсчета (еще один способ проверить, являются ли значения уникальными):

jq '.rootLevel | group_by(.clientId) | map(select(length>1)) | length' file.json

Проверить, существует ли поле для всех объектов

Если я хочу проверить, что все объекты этого массива json имеют поле .processId, я бы сделал это:

jq '.rootLevel[] |.processId?' file.json | grep -m1 null

и проверьте статус выхода grep. Это значит:

if jq '.rootLevel[] |.processId?' file.json | grep -qm1 null; then
    echo "FAILURE"
else
    echo "SUCCESS"
fi

Сочетая приведенные выше указания, вы можете сделать все, что вы упомянули в своем вопросе.

Если у вас много работы с похожими вещами, рассмотрите возможность использования «База данных JSON» (или «База данных документов» или «База данных Nosql» ).

1
18.03.2021, 22:49

Теги

Похожие вопросы