我使用它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 一样被转义(前置),那么您可以在将文档提供给以下内容之前\
翻译引号:tr
jq
cat file_with_single_quotes | tr "'" '"' | jq ...
或者更简单的:
tr "'" '"' < file_with_single_quotes | jq ...
对于您问题中的文字:
$ tr "'" '"' < file_sq | jq .aggs.two
{
"composite": {
"size": 700
}
}