首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用jq将JSON响应转换为键值对

使用jq将JSON响应转换为键值对
EN

Stack Overflow用户
提问于 2020-02-13 17:09:38
回答 3查看 472关注 0票数 0

因此,我从API获得响应,该API以下面的形式在shell脚本中调用

代码语言:javascript
运行
复制
[{"id":100000004,"name":"Customs Clearance Requested"},{"id":100000005,"name":"Customs Cleared"},{"id":100000006,"name":"Cargo Loaded to Vessel"}]

我想用它创建一个地图,这将帮助我从名称中查找id并在shell脚本中使用它。因此,像地图“清关要求”会给我100000004,我可以进一步使用。这能用jq来完成吗?我对shell脚本和jq非常陌生,并且被上面的东西困住了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-13 17:36:02

代码语言:javascript
运行
复制
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作为输出:

代码语言:javascript
运行
复制
declare -A map=(["Cargo Loaded to Vessel"]="100000006" ["Customs Clearance Requested"]="100000004" ["Customs Cleared"]="100000005" )

...which您可以完全按照请求进行查询:

代码语言:javascript
运行
复制
$ echo "${map['Cargo Loaded to Vessel']}"
100000006
票数 3
EN

Stack Overflow用户

发布于 2020-02-13 17:28:25

您可以使用select函数,例如:

代码语言:javascript
运行
复制
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"的元素,例如:

代码语言:javascript
运行
复制
[
  {
    "id": 100000004,
    "name": "Customs Clearance Requested"
  }
]

如果您想获得id字段:

jq 'map(select(.["name"] == "Customs Clearance Requested")["id"])' <<< $data

这将产生以下结果:

代码语言:javascript
运行
复制
[
  100000004
]

请注意,它将返回一个数组,而不是一个元素,因为搜索不知道将找到多少结果。

如果要在shell函数中概括这一点,可以编写:

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 2020-02-13 19:22:28

以下内容与@CharlesDuffy的出色回答非常相似,但并不假定.name.id值是无任何的(即,没有任何"\u0000“字符):

代码语言:javascript
运行
复制
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值包含双引号,那么您可能需要处理\"出现的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60213193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档