将无效 json 转换为 bash 中的有效

Convert invalid json into valid one in bash

我从脚本中得到无效 JSON,例如

{
  name: "Leo",
  active: true
}

是否有一个 bash 可安装的工具我可以用来通过管道输出并将其转换为有效的 JSON 因此可以由 jq 处理,因为 jq 不支持它?

这个问题类似于 Convert invalid json into valid json 除了我需要一个命令行实用程序而不是一些基于 php 代码的替换。

Hjson做这种事情真的很好

$ hjson -j <<EOF
> {
>   name: "Leo",
>   active: true
> }
> EOF
{
  "name": "Leo",
  "active": true
}

因为我不知道部署 Hjson 有多容易(来自 Steve Bennett 的回答),这里有一个更轻量级的替代方案,使用 sed:

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

请注意,这更具体到您在问题中提供的示例:它只会修复键周围缺少的引号。此外,它可能过于激进,例如,整数键也会被引用。

https://github.com/stedolan/jq/wiki/FAQ#processing-not-quite-valid-json 上的 jq FAQ 列出了几种用于将 near-JSON 转换为 JSON 的工具(包括 hjson)。其中一些可以用作 bash 命令,例如 https://www.npmjs.com/package/any-json,特别多才多艺。

顺便说一下,由于 jq 允许在 jq 程序中以灵活的方式指定 JSON(例如,键名周围的引号可以省略,可以添加“#”注释),您可以使用 jq本身将许多不完全 JSON 的实例转换为 JSON。使用您的示例,如果不完全 JSON 文本位于名为 input.nqj 的文件中,则调用:

$ jq -n -f input.nqj

会产生:

{
  "name": "Leo",
  "active": true
}