Дополнение NVDAJson ддобавляет утилиты для обработки JSON в NVDA.
Бывают ситуации, когда у нас есть несколько JSON, по одному на строку (например, строки журнала):
{«datetime»: «2022-03-10 21:04:05», „level“: «info», „message“: «пользователь вошел в систему"}
{ «datetime»: «2022-03-10 21:04:08», „level“: «error», „message“: «База данных не работает"}
При нажатии «NVDA+shift+j» это дополнение берет каждую строку, форматирует и отображает все элементы в виде списка.
Отформатированный текст будет отображаться следующим образом:
[
{
«datetime": «2022-03-10 21:04:05»,
«level": «info»,
«message": «пользователь вошел в систему»
},
{
«datetime": «2022-03-10 21:04:08»,
«level": «ошибка»,
«message": «База данных не работает»
}
]
Это дополнение позволяет фильтровать / преобразовывать JSON с помощью JQ или JSONPath.
По умолчанию используется JQ, но вы можете изменить это в панели настроек NVDA.
Когда вы открываете диалог JSON с помощью «NVDA+j» или «NVDA+shift+j», вы видите три текстовых поля: исходный текст, выражение запроса и выход.
Для фильтрации/преобразования JSON необходимо использовать второе текстовое поле. Вы вводите запрос, нажимаете Enter и проверяете результат в текстовом поле «Выход».
Для проверки этой функции вы можете использовать этот поддельный лог-файл:
{«timestamp»: «2024-11-07T14:12:45Z», „level“: «INFO», „trace_id“: «abc123», „span_id“: «span789», „message“: «User login successful"}
{ «timestamp»: «2024-11-07T14:13:12Z», „level“: «ERROR», „trace_id“: «def456», „span_id“: «span101», „message“: «Не удалось подключиться к базе данных"}
{ «timestamp»: «2024-11-07T14:15:30Z», „level“: «DEBUG», „trace_id“: «ghi789», „span_id“: «span202», „message“: «Fetching data from cache"}
{ «timestamp»: «2024-11-07T14:17:02Z», „level“: «WARN», „trace_id“: «jkl012», „span_id“: «span303», „message“: «Обнаружено высокое использование памяти"}
{ «timestamp»: «2024-11-07T14:19:25Z», „level“: «INFO», „trace_id“: «mno345», „span_id“: «span404», „message“: «Запущено фоновое задание"}
{ «timestamp»: «2024-11-07T14:21:58Z», „level“: «ERROR», „trace_id“: «pqr678», „span_id“: «span505», „message“: «Timeout while waiting for external API response"}
{ «timestamp»: «2024-11-07T14:23:47Z», „level“: «DEBUG», „trace_id“: «stu901», „span_id“: «span606», „message“: «Данные профиля пользователя успешно разобраны"}
{ «timestamp»: «2024-11-07T14:25:15Z», „level“: «WARN», „trace_id“: «vwx234», „span_id“: «span707», „message“: «Вызвана устаревшая версия API"}
{ «timestamp»: «2024-11-07T14:27:33Z», „level“: «INFO», „trace_id“: «yzb567», „span_id“: «span808», „message“: «Файл успешно загружен"}
{ «timestamp»: «2024-11-07T14:29:09Z», „level“: «ERROR», „trace_id“: «cde890», „span_id“: «span909», „message“: «Null pointer exception encountered"}
JQ - это как язык программирования для фильтрации и преобразования JSON-данных.
Благодаря такой гибкости, этот механизм запросов используется в дополнении по умолчанию.
Примеры JQ-программ:
| описание | запрос | |
|---|---|---|
| Получить исходный JSON | . |
|
| Извлечь все сообщения журнала | [].message |
|
| Получить все записи INFO | .[] | select(.level == «INFO») |
|
| Получить объект, содержащий только «timestamp» и «message» для записей WARN | [] | select(.level == «WARN»)| {timestamp, message} |
|
| Получение временной метки записей, содержащих в сообщении слово «cache» | [] | select(.message | test(«cache»)) | .timestamp |
|
| Получить только поля «message» и «timestamp», сгруппированные по уровню | group_by(.level) | map({(.[0].level): map({message: .message, timestamp: .timestamp})}) |
|
| Получить первые три записи с уровнем DEBUG | [] | select(.level == «DEBUG»)| . | limit(3;.) |
|
| Добавить поле «is_critical=true» для уровней ERROR и false для остальных | [] | .is_critical = (.level == «ERROR») | . |
|
| Удаление записей DEBUG | map(select(.level != «DEBUG»)) |
|
| Сортировка записей по метке времени, по возрастанию | sort_by(.timestamp) |
JSONPath - это синтаксис, позволяющий фильтровать элементы JSON.
Вы можете изучить его в документации.
Примеры запросов:
| описание | запрос |
|---|---|
| Получить исходный JSON | $ |
| Извлечь все сообщения журнала | $..message |
| Получить записи с уровнем = ERROR | $[?(@.level == 'ERROR')] |
| Извлеките поле «trace_id» из всех записей INFO | $[?(@.level == 'INFO')].trace_id |
| Получить все записи, не относящиеся к отладке | $[?(@.level != 'DEBUG')] |
| Извлечение всех журналов до временной метки | $[?(@.timestamp > '2024-11-07T14:20:00Z')] |
Оригинальная идея от @thgcode в этом выпуске
Дано следующее JSON:
{
"name": "Josiel",
"family": {
"mother": {"name": "Maria"}
},
«programming_languages": [«Java», «PHP»]
}
С помощью этой функциональности вы можете создавать строки, используя плейсхолдеры с синтаксисом JSONPointer:
Меня зовут {/name}, мою маму зовут {/family/mother/name}, а мой любимый язык программирования {/programming_languages/1}
Выходные данные:
Меня зовут Джосиэль, мою маму зовут Мария, а мой любимый язык программирования - PHP
В поле редактирования выражения:
В списке предложений: