Преобразование недопустимого json в действительный в bash

Я получаю неверный JSON из скрипта, например.

{
  name: "Leo",
  active: true
}

Есть ли инструмент для установки bash, который я могу использовать для передачи этого вывода и преобразования его в действительный JSON, чтобы он мог быть обработан jq, если jq его не поддерживает?

Этот вопрос аналогичен преобразованию недопустимого json в действительный json, за исключением того, что мне нужна команда линейная утилита, а не какая-то замена на основе php-кода.


person Leo Gallucci    schedule 26.11.2015    source источник


Ответы (3)


Hjson отлично с этим справляется.

$ hjson -j <<EOF
> {
>   name: "Leo",
>   active: true
> }
> EOF
{
  "name": "Leo",
  "active": true
}
person Steve Bennett    schedule 26.11.2015
comment
Именно то, что я искал. Я буду использовать версию Python pip3 install hjson && cli53 list | python -m hjson.tool -j Спасибо!!! - person Leo Gallucci; 26.11.2015

Часто задаваемые вопросы по jq на странице https://github.com/stedolan/jq/wiki/FAQ#processing-not-quite-valid-json перечисляет несколько инструментов (включая hjson) для преобразования почти JSON в JSON. Некоторые из них можно использовать как команды bash, например. https://www.npmjs.com/package/any-json, который особенно универсален.

Между прочим, поскольку jq позволяет гибко указывать JSON в программе jq (например, кавычки вокруг имен ключей могут быть опущены, а комментарии «#» могут быть добавлены), вы можете использовать сам jq для преобразования многих экземпляров не совсем JSON в JSON. Используя ваш пример, если не совсем текст JSON находится в файле с именем input.nqj, то вызов:

$ jq -n -f input.nqj

будет производить:

{
  "name": "Leo",
  "active": true
}
person peak    schedule 26.11.2015

Поскольку я не знаю, насколько просто развернуть Hjson (из ответа Стива Беннета), вот более легкая альтернатива, использующая sed:

$ sed 's/\b\([^:"]*\)\b\s*:/"\1":/g' <<EOF
> {
>   name: "Leo",
>   active: true
> }
> EOF
{
  "name": "Leo",
  "active": true
}

Обратите внимание, что это более конкретно для примера, который вы указали в вопросе: он исправит только отсутствующие кавычки вокруг ключей. Кроме того, это может быть слишком агрессивно, так как, например, целочисленные ключи также будут заключены в кавычки.

person matz    schedule 26.11.2015
comment
Вы были быстрее :) Я использовал sed 's/([[:alpha:]]*):/\1:/' - person bytesinflight; 26.11.2015