我有一个bash脚本(在windows上运行的git bash),该脚本使用curl从服务器中获取JSON响应。响应包含一个包含JSON数据的字段。响应看起来像这样:
[{
"Status": "A",
"JSON": "{"field1":"value1"}"
}, {
"Status": "B",
"JSON": "{"field1":"value2"}"
}]
这是我试图用以下方式解析此字符串的bash脚本:
#!/bin/bash
echo "parsing result in variable"
result='[{"Status":"A", "JSON":"{"field1":"value1"}"},{"Status":"B", "JSON":"{"field1":"value2"}"}]'
echo $result > json_in_json.json
result=$(echo "$result" | jq '[.[]."Status"]')
echo $result
echo "parsing result from file"
jq '[.[]."Status"]' json_in_json.json
这是我在终端中看到的
parsing result in variable
[{"Status":"A", "JSON":"{"field1":"value1"}"},{"Status":"B", "JSON":"{"field1":"value2"}"}]
]B",
parsing result from file
[
"A",
"B"
]
是否有一种方法可以使JQ输出相同的结果而无需通过临时文件?
jq
为解析嵌入式JSON提供了fromjson
功能。例如,
$ jq '.[].JSON | fromjson | .field1' tmp.json
"value1"
"value2"
更新:
问题不是jq
,而是tee
将其输入写入标准输出以及任何称为参数的文件。重定向到/dev/null
echo "$result" | tee json_in_json.json > /dev/null
或不使用tee
。
echo "$result" > json_in_json.json
我已经对JQ提交了一个错误,但是将其关闭,因为它在Ubuntu或MacOS上不可重现。尼科·威廉姆斯(Nico Williams)解释了这里发生了什么:
https://github.com/stedolan/jq/issues/1855