如何用jq将类对象格式的命令输出转换为标准JSON?
如何将类JSON格式转换为标准JSON?
嘿,我懂你遇到的麻烦了——你拿到的这个输出是个松散的类JSON结构,最大的问题是键名没有用双引号包裹,这不符合严格的JSON规范,所以之前的split方法只能把它拆成字符串数组,没法解析成真正的JSON对象。
这里有个直接用jq搞定的方案,一步到位把它转成标准JSON:
echo "$output" | jq -R -s 'gsub("([a-zA-Z_]+):"; "\"\1\":") | fromjson'
我来拆解一下这个命令的作用:
-R:告诉jq把每一行输入都当作原始字符串处理,而不是尝试直接解析成JSON-s:把所有输入的行拼接成一个完整的字符串,方便后续统一处理gsub("([a-zA-Z_]+):"; "\"\1\":"):用正则匹配所有的键名(由字母、下划线组成的标识符),给它们加上双引号,把currentBlock:这种格式替换成"currentBlock":fromjson:把处理后的符合规范的字符串解析成标准的JSON对象
执行这个命令后,你会得到完美的标准JSON输出:
{ "currentBlock": 4769045, "highestBlock": 7063981, "knownStates": 15306625, "pulledStates": 15306625, "startingBlock": 0 }
如果你偏好先用sed做预处理,再用jq解析,也可以试试这个命令:
echo "$output" | sed 's/\([a-zA-Z0-9_]*\):/"\1":/g' | jq .
这个思路和上面一致,都是先给键名补上双引号,再让jq解析成标准JSON。
内容的提问来源于stack exchange,提问作者wolfeye
相关产品推荐
相关产品推荐

