因此,我从API获得响应,该API以下面的形式在shell脚本中调用
[{"id":100000004,"name":"Customs Clearance Requested"},{"id":100000005,"name":"Customs Cleared"},{"id":100000006,"name":"Cargo Loaded to Vessel"}]
我想用它创建一个地图,这将帮助我从名称中查找id并在shell脚本中使用它。因此,像地图“清关要求”会给我100000004,我可以进一步使用。这能用jq来完成吗?我对shell脚本和jq非常陌生,并且被上面的东西困住了。
发布于 2020-02-13 17:36:02
json='[{"id":100000004,"name":"Customs Clearance Requested"},{"id":100000005,"name":"Customs Cleared"},{"id":100000006,"name":"Cargo Loaded to Vessel"}]'
declare -A map
while IFS= read -r -d '' name && IFS= read -r -d '' value; do
map[$name]=$value
done < <(jq -j '.[] | "\(.name)\u0000\(.id)\u0000"' <<<"$json")
declare -p map # demo purposes: print the map we created as output
...emits作为输出:
declare -A map=(["Cargo Loaded to Vessel"]="100000006" ["Customs Clearance Requested"]="100000004" ["Customs Cleared"]="100000005" )
...which您可以完全按照请求进行查询:
$ echo "${map['Cargo Loaded to Vessel']}"
100000006
发布于 2020-02-13 17:28:25
您可以使用select
函数,例如:
data='[{"id":100000004,"name":"Customs Clearance Requested"},{"id":100000005,"name":"Customs Cleared"},{"id":100000006,"name":"Cargo Loaded to Vessel"}]'
jq 'map(select(.["name"] == "Customs Clearance Requested"))' <<< $data
它将获得所有名称等于"Customs Clearance Requested"
的元素,例如:
[
{
"id": 100000004,
"name": "Customs Clearance Requested"
}
]
如果您想获得id字段:
jq 'map(select(.["name"] == "Customs Clearance Requested")["id"])' <<< $data
这将产生以下结果:
[
100000004
]
请注意,它将返回一个数组,而不是一个元素,因为搜索不知道将找到多少结果。
如果要在shell函数中概括这一点,可以编写:
function get_id_from_name
{
# $1=name to search for
local filter=$(printf 'map(select(.["name"] == "%s")["id"])' "$1")
jq "$filter"
}
那就这么说吧:
get_id_from_name "Customs Clearance Requested" <<< $data
如果您的数据存储在一个文件中,您可以这样称呼它:
get_id_from_name "Customs Clearance Requested" < /path/to/file.json
发布于 2020-02-13 19:22:28
以下内容与@CharlesDuffy的出色回答非常相似,但并不假定.name
和.id
值是无任何的(即,没有任何"\u0000“字符):
declare -A map
while read -r name
do
name=$(sed -e 's/^"//' -e 's/"$//' <<< "$name")
read -r id
map[$name]="$id"
done < <(echo "$json" | jq -c '.[]|.name,.id')
关键是-j选项类似于-r (即生成“原始输出”),而-c选项则生成JSON。
这意味着,如果您不希望.id值作为JSON字符串,那么上面的内容将不是一个解决方案;而且,如果.name值包含双引号,那么您可能需要处理\"
出现的问题。
https://stackoverflow.com/questions/60213193
复制相似问题