JQ无法在GIT BASH for WINDOWS上使用嵌入式JSON解析JSON
我有一个bash脚本(在git bash for windows上运行),它使用curl从服务器获取json响应。响应包含一个包含json数据的字段。响应如下所示:JQ无法在GIT BASH for WINDOWS上使用嵌入式JSON解析JSON,json,jq,Json,Jq,我有一个bash脚本(在git bash for windows上运行),它使用curl从服务器获取json响应。响应包含一个包含json数据的字段。响应如下所示: [{ "Status": "A", "JSON": "{\"field1\":\"value1\"}" }, { "Status": "B", "JSON": "{\"field1\":\"value2\"}" }] 下面是我试图解析此字符串的bash脚本: #!/bin/bash echo "pa
[{
"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
提供了一个fromjson
函数来解析嵌入的JSON。比如说,
$ 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提交了一个关于这个的bug,但是关闭了它,因为它在ubuntu或macos上不可复制。Nico Williams解释了这里发生的事情:
您看到的输出是由于
tee
的输出,与jq
无关。您的脚本从不涉及嵌入的JSONecho“$result”>json\u in_json.json
就足够了。TarekZ-您使用的是什么版本的bash?在哪个站台?我在MacOS上使用bash 3或bash 4时没有问题。我正在git bash for windows上进行测试。Bash版本4.4.12I在解析文件中的json时没有问题。但是我尝试不使用tmperory文件,而是使用存储在变量中的结果。此外,我不关心JSON部分,我关心的是状态字段。JSON字段只是与jq select链接;这个问题与jq
无关,但事实是tee
在显示jq'
结果之前将完整的JSON转储到标准输出。而且,在这种情况下,您的问题标题完全是误导性的。我将tee放在那里是为了表明它是存储在变量result和文件中的相同JSON。如果将字符串的内容复制到文件中,则可以删除T形三通。它将产生同样的结果。正如我在文章末尾所说的,我想得到使用文件时得到的[“A”,“B”]结果,而不是解析变量时得到的]B。我明白你对tee的意思了。我改变了脚本,但结果还是一样。很抱歉给你带来了困惑。