我能否将字符串变量传递给jq而不是文件?

96

我想在bash中将JSON字符串转换为数组。JSON字符串作为参数传递给bash脚本(不存在于文件中)。

是否有一种方法可以在不使用临时文件的情况下实现它?

类似于这样的方法:

script.sh

#! /bin/bash
json_data='{"key":"value"}'
jq '.key' $json_data

jq: error: Could not open file {key:value}: No such file or directory
8个回答

173

我建议使用Bash here string。例如:

jq '.key' <<< "$json_data"

3
我该如何使用两个字符串而不是两个文件,以便我可以使用 jq -s '.[0] * .[1]' file1 file2 呢? - Katie
1
@KatieS:使用一个新的Bash变量来连接这两个字符串,然后传递它。 - MSalters
你如何将其结果导入到其他地方? - CpILL
也许可以使用 jq '.key' <<< "$json_data" | 其他操作 - jq170727
1
我认为这种语法更易于理解:echo "$json_data" | jq '.key' - Alex

40

在原问题中提供的变量“json_data”的值不是有效的JSON,因此此响应仍覆盖了两种情况(几乎有效和有效的JSON)。

有效的JSON

如果“$json_data”包含有效的JSON值,则此处有两个其他页面未提到的替代方法。

--argjson

例如:

 jq -n --argjson data "$json_data" '$data.key'

env

如果Shell变量还不是环境变量:

json_data="$json_data" jq -n 'env.json_data | fromjson.key'

几乎有效的JSON

如果 $json_data 确实作为 JSON 是无效的,但作为 jq 表达式是有效的,则您可以采用以下记录所示的策略:

$ json_data='{key:"value"}'
$ jq -n "$json_data" | jq .key
"value"

我的意思是'key'应该是字符串类型。也许应该使用'name'这个词。 - Maciek Rek
无论如何,这两个例子在我的Mac上都可以工作(使用bash),即使使用引号括起来的“key”,并且产生了与jq170727解决方案中的here string类似的结果。 - Maciek Rek
3
对于不需要关键搜索的其他人来说,只需运行jq -n $json_data。如此简单,但是文档和在线示例对于这样简单的情况非常不清晰。它们似乎都假定您想做一些复杂的事情。 - Mike B

21

使用bash命令:echo "$json_data" | jq '.key'


12

当然可以。只需要告诉bash给它一个文件即可。

jq '.key' <(echo "$json_data")

确保在bash中运行它,而不是sh。


8
如果您想使用内联命令,我在我的Mac上发现了这个方法:
echo '{"key":"value"}' | jq .key

1
将结果存储在变量中以便后续使用。假设您的JSON已经存储在一个变量中,而您需要将结果存储到另一个变量中。jsonData="{"key":"value"}" result=$(echo $jsonData | jq -r '.key')echo $result 将输出 value 作为结果。 - Gaurav Dalal

5
#! /bin/bash
json_data='{"key":"value"}'
echo $json_data | jq --raw-output '.key'

2
如果您想在一个名为.sh的文件中进行此操作,以下是我使用的方法:
local json_data $(getJiraIssue "$1")               # store JSON in var
echo `jq -n "$json_data" | jq '.fields.summary'`   # pass that JSON var to jq

-2

只需做

$ jq '.key' <<< $'{"key":"value"}'
"value"

我点了个踩,因为这段代码在某些shell中由于 <<< 无法使用。 - bfontaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接