繁体   English   中英

如何在 jq json bash 脚本中解析带间距的多个属性?

[英]How to parse multi properties with spacing in jq json bash script?

我有一个 json 字符串,格式如下:

json='{"x": [{"y":"yyy1", "z":"zzz1 zzz1"}, {"y":"yyy2", "z":"zzz2 zzz2"}]}'

我正在尝试使用 jq 获取所有“y”的数组 var 和单独的“z”数组

y_arr=$(echo "${json}" | jq '.x | [] | .y') # => outputs 2 array elements 
y_arr=$(echo "${json}" | jq '.x | [] | .z') # => outputs 4 array elements due to space

你知道如何解决这个问题吗? 另外,您知道将 json 解析为单个键/值数组而不是两个单独的 arrays 的更好方法吗?

假设您的 bash 具有readarray (又名mapfile )并且具有 bash 数组值是有效的 JSON 是可以接受的,您可以写:

readarray z_array < <(echo "${json}" | jq -c '.x[] | .z') 

使用您的 $json,这将产生一个 JSON 字符串数组(带引号)。

shell 回路

如果您的 shell 不支持readarray ,那么您可以使用 jq 的相同调用但读取 bash 循环中的值,例如:

declare -a array
while read v
do
    array+=("$v")
done < <(echo "${json}" | jq -c '.x[] | .z') 

字符串

如果所有的 .z 值都是 JSON 字符串,那么如果这些字符串没有嵌入的换行符,并且您希望 bash 数组值是“原始”字符串(与 Z0ECD11C1D7A287401D148A2F 字符串相反),您可以添加 BBBBBD -A7401D148A23到 jq 的调用。

联想Arrays

如果您的 bash 支持关联 arrays,请考虑:

declare -A a
i=0
while read v
do
    i=$((i+1))
    a["$v"]=$i
done < <(echo "${json}" | jq -c '.x[].z') 

declare -p a

for i in "${!a[@]}" ; do
  echo $i
done    

这会产生:

declare -A a=(["\"zzz2 zzz2\""]="2" ["\"zzz1 zzz1\""]="1" )
"zzz2 zzz2"
"zzz1 zzz1"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM