有没有办法让“jq”读取带有单引号而不是双引号的json?

有没有办法让“jq”读取带有单引号而不是双引号的json?

我使用它jq作为解析大型嵌套json文件的有效方法。有时我想要jq一个json格式化文件,该文件在键和值周围有单引号而不是双引号,如下所示:

{
  'aggs': {
    'two': {
      'composite': {
        'size': 700
       }
     }
  }
}

我知道这不被认为是实际json格式,但我想知道 jq 是否有一些我可以设置来读取此文件的参数,否则它无法读取此文件。

如果没有,linux中将所有单引号替换为双引号以便可以读取的最有效方法是什么jq

答案1

对键或一般字符串使用单引号是破坏性的JSON 格式规范,但我们可以将该文档解释为包含文字(单引号)字符串的 YAML 文档。

迈克·法拉赫yq能够将其解析为 YAML(带有下面提到的注意事项),并将其转换为标准 JSON:

$ yq -oj eval . file
{
  "aggs": {
    "two": {
      "composite": {
        "size": 700
      }
    }
  }
}

请注意,它会'1"2'正确转换为"1\"2",但它不会处理'1\'2'(它会给出错误,但这并不奇怪,因为该字符串在 YAML 中也是无效字符串)。由于反斜杠在单引号 YAML 字符串中是文字,这意味着它会转换'1\"2'"1\\\"2".

由于反斜杠是文字反斜杠,因此它可能无法对包含其他已编码值的字符串执行您想要的操作,例如编码为的文字换行符\n或编码为的文字制表符\t,将它们分别转换为\\n\\t

安德烈·基斯柳克yq(这是 的包装jq)似乎与 Mike 具有相同的限制和警告yq

$ yq . file
{
  "aggs": {
    "two": {
      "composite": {
        "size": 700
      }
    }
  }
}

史蒂芬·莱文的yj,也可用于将数据从 YAML 转换为 JSON:

$ yj <file
{"aggs":{"two":{"composite":{"size":700}}}}

答案2

如果在这些文件中,引号像 json 一样被转义(前置),那么您可以在将文档提供给以下内容之前\翻译引号:trjq

cat file_with_single_quotes | tr "'" '"' | jq ...

或者更简单的:

tr "'" '"' < file_with_single_quotes | jq ...

对于您问题中的文字:

$ tr "'" '"' < file_sq | jq .aggs.two
{
  "composite": {
    "size": 700
  }
}

相关内容