bash 使用 jq 遍历 JSON 对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/39736840/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Loop through JSON object using jq
提问by Asdfg
This is what my JSON array of objects looks like:
这是我的 JSON 对象数组的样子:
[
{
"Description": "Description 1",
"OutputKey": "OutputKey 1",
"OutputValue": "OutputValue 1"
},
{
"Description": "Description 2",
"OutputKey": "OutputKey 2",
"OutputValue": "OutputValue 2"
},
{
"Description": "Description 3",
"OutputKey": "OutputKey 3",
"OutputValue": "OutputValue 3"
},
{
"Description": "Description 4",
"OutputKey": "OutputKey 4",
"OutputValue": "OutputValue 4"
},
{
"Description": "Description 5",
"OutputKey": "OutputKey 5",
"OutputValue": "OutputValue 5"
},
{
"Description": "Description 6",
"OutputKey": "OutputKey 6",
"OutputValue": "OutputValue 6"
}
]
How do i iterate over this using jq so that i can use the values of OutputKey and OutputValue in other commands?
我如何使用 jq 迭代这个,以便我可以在其他命令中使用 OutputKey 和 OutputValue 的值?
回答by Charles Duffy
Assuming your content is coming from in.json
:
假设您的内容来自in.json
:
#!/usr/bin/env bash
case $BASH_VERSION in (""|[123].*) echo "Bash 4.0 or newer required" >&2; exit 1;; esac
declare -A values=( ) descriptions=( )
while IFS= read -r description &&
IFS= read -r key &&
IFS= read -r value; do
values[$key]=$value
descriptions[$key]=$description
echo "Read key $key, with value $value and description $description" >&2
done < <(jq -r '.[] | (.Description, .OutputKey, .OutputValue)' <in.json)
Given your input, this emits the following to stderr:
根据您的输入,这会向 stderr 发出以下内容:
Read key OutputKey 1, with value OutputValue 1 and description Description 1
Read key OutputKey 2, with value OutputValue 2 and description Description 2
Read key OutputKey 3, with value OutputValue 3 and description Description 3
Read key OutputKey 4, with value OutputValue 4 and description Description 4
Read key OutputKey 5, with value OutputValue 5 and description Description 5
Read key OutputKey 6, with value OutputValue 6 and description Description 6
Moreover, after this code is run, you can then execute:
此外,在运行此代码后,您可以执行:
key_to_look_up="OutputKey 1"
echo "${values[$key_to_look_up]}"
echo "${descriptions[$key_to_look_up]}"
...and get as output:
...并作为输出:
OutputValue 1
Description 1
回答by peak
I'm afraid your question isn't very clear. If you want to produce the values for consumption by some tool or application other than jq, then it would be helpful to know what that tool expects. If you want to use the values in jq itself, then you could use
map
orreduce
; alternatively, you could use a filter having the form:.[] | ...
or[.[] ...]
, where the...
is some jq code that accesses the values of interest, e.g.[.[] | [.OutputKey, .OutputValue] ]
If you want to perform some reduction operation, then you will probably want to use the form:
reduce .[] as $x (_; _)
There are other alternatives, depending on what it is you are trying to do.
恐怕你的问题不是很清楚。如果您想为 jq 以外的某个工具或应用程序生成消耗值,那么了解该工具期望什么会很有帮助。如果你想使用 jq 本身的值,那么你可以使用
map
orreduce
; 或者,您可以使用具有以下形式的过滤器:.[] | ...
或[.[] ...]
,其中...
是访问感兴趣值的一些 jq 代码,例如[.[] | [.OutputKey, .OutputValue] ]
如果您想执行一些归约操作,那么您可能需要使用以下形式:
reduce .[] as $x (_; _)
还有其他选择,这取决于您要尝试做什么。