使用jq循环访问JSON对象

时间:2016-09-28 01:55:46

标签: bash iteration jq

这就是我的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"
    }
]

我如何使用jq迭代这个,以便我可以在其他命令中使用OutputKey和OutputValue的值?

2 个答案:

答案 0 :(得分:7)

假设您的内容来自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)

根据您的输入,这将向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

此外,运行此代码后,您可以执行:

key_to_look_up="OutputKey 1"
echo "${values[$key_to_look_up]}"
echo "${descriptions[$key_to_look_up]}"

...并获得输出:

OutputValue 1
Description 1

答案 1 :(得分:1)

  1. 我担心你的问题不是很清楚。如果您想通过jq以外的某些工具或应用程序生成消耗值,那么了解该工具所期望的内容会很有帮助。如果您想使用jq本身的值,那么您可以使用mapreduce;或者,您可以使用格式为.[] | ...[.[] ...]的过滤器,其中...是一些访问感兴趣的值的jq代码,例如

    [.[] | [.OutputKey, .OutputValue] ]
    
  2. 如果您想执行某些缩小操作,那么您可能需要使用以下表单:reduce .[] as $x (_; _)

  3. 还有其他选择,具体取决于您尝试做什么。