Правовое изменение ввода JSON делает недействительным простой jq - PullRequest
0 голосов
/ 12 июня 2018

Другой отдел постоянно обновляет файл JSON, который я затем запрашиваю.Его формат состоит из трех списков похожих словарей:

{
"levels":
[
{"a":1, "b":False, "c":"2012", "d":"2017"}
,{"a":2, "b":True,  "c":"2013", "d":"9999"}
,...
]
,"costs":
[
{"e":12, "f":"foo", "g":"blarg", "h":"2015", "i":"2018"}
,{"e":-3, "f":"foo", "g":"glorb", "h":"2013", "i":"9999"}
,...
]
,"recipes":
[
{"j":"BAZ", "k":["blarg","glorb","bleeg"], "l":"dill", "m":"2016", "n":"2017"}
,{"j":"BAZ", "k":["blarg","bleeg"], "l":"dill", "m":"2017", "n":"9999"}
,...
]
}   # line 3943 (see below)

Недавно мои простые jq запросы типа

jq '.["recipes"][] | select(.l | test("ill"))' < jsonfile

перестали возвращать все результаты, которые должны были (например, возвращать толькоодна из двух строк «Укроп» выше) и начал печатать это сообщение об ошибке:

jq: error (at <stdin>:3943): null (null) cannot be matched, as it is not a string

Строка 3943, упомянутая в ошибке, является последней строкой файла.Запросы к разделам «уровни» и «затраты» файла продолжают работать как обычно;нарушается только раздел «рецепты» файла, как будто jq считает, что закрывающая скобка файла все еще является частью раздела «рецепты».

Для меня это говорит о том, что форматирование было выполненоизменение или ошибка в последнем разделе файла.Однако программное обеспечение, отличное от jq (например, python), не сообщает о проблемах при его разборе.Перед тем, как начать построчно вводить данные ... указывает ли это сообщение об ошибке на что-то очевидное для jq эксперта?

Увы, я не сохраняю старые версии файла для сравнения.(Я думаю, что я начну сегодня.)

1 Ответ

0 голосов
/ 12 июня 2018

(автоответчик после небольшого исследования)

Я думаю, что не было ошибок форматирования или изменения форматирования во входных данных.

Я не знаю, почему мой синтаксис запроса сделал не сталкивался с ошибками ранее (может быть, я просто не заметил), но кажется, что записи в разделе "рецепты" часто не содержат атрибута "l", и jq прекратит обработку, как толькопоскольку он сталкивается с тем, который не имеет.

Я также не знаю, почему jq не генерирует такое же сообщение об ошибке для каждой записи, в которой отсутствует этот атрибут, или почему он ожидаетпоследняя строка ввода для генерации одного сообщения.(Возможно, такое поведение где-то задокументировано.)

В любом случае я исправил ошибку (не только сообщение, но и не отображал все соответствующие записи), проверив сначала наличие атрибута:

jq '.["recipes"][] | select(has("l") and (.l | test("ill")))' < jsonfile
...