栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从bash关联数组构造json哈希

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从bash关联数组构造json哈希

有很多可能性,但是鉴于您已经编写了一个bash

for
循环,您可能希望从脚本的这种变体开始:

#!/bin/bash# Requires bash with associative arraysdeclare -A dictdict["foo"]=1dict["bar"]=2dict["baz"]=3for i in "${!dict[@]}"do    echo "$i"     echo "${dict[$i]}"done |jq -n -R 'reduce inputs as $i ({}; . + { ($i): (input|(tonumber? // .)) })'

结果反映了bash

for
循环产生的键的顺序:

{  "bar": 2,  "baz": 3,  "foo": 1}

通常,基于馈送jq键值对的方法有很多值得推荐的方法,其中一个键在一行上,然后是对应的值在下一行上。下面给出了遵循此通用方案但使用NUL作为“行尾”字符的通用解决方案。

键和值作为JSON实体

为了使以上内容更加通用,最好将键和值显示为JSON实体。在当前情况下,我们可以这样写:

for i in "${!dict[@]}"do    echo ""$i""    echo "${dict[$i]}"done | jq -n 'reduce inputs as $i ({}; . + { ($i): input })'

其他变化

JSON密钥必须是JSON字符串,因此可能需要做一些工作才能确保实现从bash密钥到JSON密钥的所需映射。类似的说明适用于从bash数组值到JSON值的映射。处理任意bash键的一种方法是让jq进行转换:

printf "%s" "$i" | jq -Rs .

当然,您可以对bash数组值执行相同的操作,然后让jq检查该值是否可以根据需要转换为数字或其他JSON类型(例如使用

fromjson? // .
)。

通用解决方案

这是jq常见问题解答中提到并由@CharlesDuffy倡导的通用解决方案。在将bash键和值传递给jq时,它将NUL用作定界符,其优点是只需要一次调用jq。如果需要,

fromjson?// .
可以省略过滤器或将其替换为另一个。

declare -A dict=( [$'foonaha']=$'anb' [bar]=2 [baz]=$'{"x":0}' )for key in "${!dict[@]}"; do    printf '%s%s' "$key" "${dict[$key]}"done |jq -Rs '  split("u0000")  | . as $a  | reduce range(0; length/2) as $i       ({}; . + {($a[2*$i]): ($a[2*$i + 1]|fromjson? // .)})'

输出:

{  "foonaha": "anb",  "bar": 2,  "baz": {    "x": 0  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394768.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号