命令输出为对象字符串提供如何使用jq将其转换为json的方法

命令输出为对象字符串提供如何使用jq将其转换为json的方法,json,bash,jq,hjson,Json,Bash,Jq,Hjson,一个命令给出了以下在对象中排列的输出,如何使用jq将其转换为json {\n currentBlock: 4769045,\n highestBlock: 7063981,\n knownStates: 15306625,\n pulledStates: 15306625,\n startingBlock: 0\n} 注意:输出不是json;它包含\n字符串 我使用下面的代码来转换它 echo "$output" | jq -R -s -c 'split(&quo

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

{\n  currentBlock: 4769045,\n  highestBlock: 7063981,\n  knownStates: 15306625,\n  pulledStates: 15306625,\n  startingBlock: 0\n}
注意:输出不是json;它包含
\n
字符串

我使用下面的代码来转换它

echo "$output" | jq -R -s -c 'split("\n")' 
但产出并不像我预期的那样


[“{”、“currentBlock:4787477”、“highestBlock:7063981”、“knownStates:15306625”、“PullerdStates:15306625”、“startingBlock:0”、““}”和“]”]

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

jq -n '{ 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_]*$

通用解决方案是使用以下工具:


如果这里的问题是准JSON包含文本“\n”字符串,那么您可以使用
sed的/\\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")

两者都产生有效的JSON。

jq-n'{\n currentBlock:4769045,\n highestBlock:7063981,\n knownStates:15306625,\n pullerdstates:15306625,\n startingBlock:0\n}'SO所示的Q没有提到任何关于换行符或'\n`字符串的内容。请澄清问题。换行符不会导致问题,但文字
“\n”
字符串会导致问题。请参阅有关处理此类字符串的单独答案。
$ echo '{ currentBlock: 4479441, highestBlock: 7063981, knownStates: 15306625, pulledStates: 15306625, startingBlock: 0 }' |
    hjson -j
{
  "currentBlock": 4479441,
  "highestBlock": 7063981,
  "knownStates": 15306625,
  "pulledStates": 15306625,
  "startingBlock": 0
}
$ 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 "$output" "" | hjson -j