2016-02-17 2 views
1

Есть ли способ получить diff для файлов JSON Lines? В случае возникновения путаницы, по словам «JSON Lines», я имею в виду формат, описанный here, который в основном требует, чтобы каждая строка была действительной структурой JSON. Во всяком случае, есть ответ here, который обсуждает использование jq для того, чтобы разграничить два разных файла JSON.Есть ли способ получить diff для файлов `JSON Lines`?

Однако, вопрос хотел, чтобы diff не учитывал порядок внутри списка, в то время как я действительно забочусь об этом заказе. Кроме того, ответы содержат jq-скрипты, которые просто дают истинный или ложный ответ и не дают полного разграничения. В идеале я бы хотел получить полный diff. Существует проектный вызов json-diff, который отличает файлы JSON, но работает только для одного объекта JSON, а не с линиями JSON.

Чтобы повторить, существует ли метод или что-то вроде сценария jq, который может получить diff для форматированных файлов в формате JSON?

+1

Если единственным ограничением использования json-diff является то, что он работает с реальными объектами JSON вместо отдельных строк, 'jq -s .' должен обернуть их в массив для вас. –

+0

Когда вы говорите, что вам нужен «полный diff», что бы это влечет за собой? Текстовый diff, как в 'json-diff'? –

+0

@SantiagoLapresta Да, я имею в виду текстовую разницу, как в 'json-diff'. Я действительно не знал о '-s/- slurp', и это может сделать это. Я просто запускал тестовую команду 'json-diff.js <(jq -s. A.jsonl) <(jq -s. B.jsonl)', и это в основном делает это. Если есть лучший способ, я бы хотел это услышать. В противном случае, если вы добавите это в качестве ответа, я приму это. – wyer33

ответ

1

Если я правильно понял вопрос, следующее должно выполнить эту работу. Я предполагаю, что у вас есть доступ к jq 1.5, который включает в себя фильтр walk/1 (если это не так, легко дополнить приведенный ниже файл определением, которое можно найти в Интернете, например, src/builtin .jq), и что у вас есть достаточно современная Mac или Linux-оболочка.

(1) Создайте файл с именем (скажем) JQ-diff.jq с этими двумя линиями:

def sortKeys: to_entries | sort | from_entries; 
walk(if type == "object" then sortKeys else . end) 

(2) Если предположить, что два файла с JSON объектов в них FILE1 и FILE2, то выполните одну из следующих команд, в зависимости от того, хотите ли вы, что JSON объекты в пределах каждого файла, который будет отсортирован:

diff <(jq -cf jq-diff.jq FILE1 | sort) <(jq -cf jq-diff.jq FILE2 | sort) 

# OR: 

diff <(jq -cf jq-diff.jq FILE1) <(jq -cf jq-diff.jq FILE2) 

Краткое объяснение:

роль JQ здесь для сортировки ключей в объекты (без сортировки массивов) и печатать их стандартным способом, по одному на строку (с учетом опции -c).

1

Вы можете использовать флаг -s, чтобы разделить объекты JSON, разделенные новой строкой, в массив JSON, содержащий их, что делает их подходящими для сравнения с json-diff.

Смежные вопросы