命令输出给出对象字符串如何使用jq将其转换为json

时间:2020-08-30 02:03:44

标签: json bash jq

命令给出以下输出,该输出排列在一个对象中,如何使用jq将其转换为json?

{\n  currentBlock: 4769045,\n  highestBlock: 7063981,\n  knownStates: 15306625,\n  pulledStates: 15306625,\n  startingBlock: 0\n}

N.B输出不是json;它包含\n个字符串。

我使用以下内容进行了转换

echo "$output" | jq -R -s -c 'split("\n")' 

但是输出不是我期望的

[“ {”,“ currentBlock:4787477,”,“ highestBlock:7063981,”,“ knownStates:15306625,”,“ pullStates:15306625,”,“ startingBlock:0”,“}”,“”] < / p>

3 个答案:

答案 0 :(得分:1)

如果这里的问题是准JSON包含文字“ \ n”字符串,那么您可以使用sed 's/\\n//g'删除它们:

$ output='{\n currentBlock: 4769045,\n highestBlock: 7063981,\n knownStates: 15306625,\n pulledStates: 15306625,\n startingBlock: 0\n}'

$ jq -n -f <(sed 's/\\n//g' <<< "$output")

另一种可能是使用printf,例如

$ printf "$output" "" | hjson -j

两者均产生有效的JSON。

答案 1 :(得分:0)

在这种特殊情况下,最初显示的“输出”是有效的jq程序,因此要将其转换为JSON,您可以简单地将其作为程序提供给jq处理器,例如:

jq -n '{ currentBlock: 4479441, highestBlock: 7063981, knownStates: 15306625, pulledStates: 15306625, startingBlock: 0 }'

输出

{
  "currentBlock": 4479441,
  "highestBlock": 7063981,
  "knownStates": 15306625,
  "pulledStates": 15306625,
  "startingBlock": 0
}

使用-f选项

如果准JSON位于文件中,例如data.txt,则只需运行:

jq -n -f data.txt

注意事项

仅当文本碰巧作为jq程序有效时,此方法才有效。特别是,如果任何键是未加引号的jq关键字,或与正则表达式都不匹配,则将无法使用

^[A-Za-z_][A-Za-z0-9_]*$

答案 2 :(得分:0)

通用解决方案是使用诸如之类的工具:

$ echo '{ currentBlock: 4479441, highestBlock: 7063981, knownStates: 15306625, pulledStates: 15306625, startingBlock: 0 }' |
    hjson -j
{
  "currentBlock": 4479441,
  "highestBlock": 7063981,
  "knownStates": 15306625,
  "pulledStates": 15306625,
  "startingBlock": 0
}