如何在 bash 中循环包含空格字符的 JSON 对象数组

问题描述 投票:0回答:1

我正在调用一个 API,它返回一个包含对象数组的 JSON 响应。我想将对象存储在 bash 中的数组中,我想循环遍历它。

使用

jq -c
来利用紧凑的输出对我很有用:

json_response='{"value":[{"displayName":"1"},{"displayName":"2"},{"displayName":"3"}]}'

workspaces=$(echo $json_response | jq -c '.value.[]')

for workspace in ${workspaces[@]}; do
    echo $workspace
done

这是输出:

{"displayName":"1"}
{"displayName":"2"}
{"displayName":"3"}

但是,如果

displayName
中有空格字符,则此方法不起作用:

json_response='{"value":[{"displayName":"1"},{"displayName":"2"},{"displayName":"3"},{"displayName":"Has Space"}]}'
    
workspaces=$(echo $json_response | jq -c '.value.[]')
    
for workspace in ${workspaces[@]}; do
    echo $workspace
done

输出包含一个换行符,其中空格字符为:

{"displayName":"1"}
{"displayName":"2"}
{"displayName":"3"}
{"displayName":"Has
Space"}

即使有空格字符,如何仍然循环遍历对象?

json bash jq
1个回答
0
投票
  1. 您应该引用 (
    ""
    ) 所有可能包含空格的 bash 变量
  2. 避免使用
    jq '.' <<< "$some_var"
    echo $some_var | jq
  3. 使用
    readarray
    创建 jq 输出的 bash 数组

#!/bin/bash

json_response='{"value":[{"displayName":"1"},{"displayName":"2"},{"displayName":"3"},{"displayName":"Has Space"}]}'

readarray -t workspaces < <(jq -c '.value[]' <<< "$json_response")

for workspace in "${workspaces[@]}"; do
    echo "--> $workspace <--"
done

在 bash 4.4.20 上给出以下内容

--> {"displayName":"1"} <--
--> {"displayName":"2"} <--
--> {"displayName":"3"} <--
--> {"displayName":"Has Space"} <--

关于我的你应该考虑在 jq 中循环工作评论;

  • 您已经在 JQ 中循环数组了,那么为什么不使用它来创建所需的输出,这样您就不需要在 bash 数组中捕获输出并对其进行循环,而是将所有魔法转换为 jq if可能
© www.soinside.com 2019 - 2024. All rights reserved.