加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从bash关联数组构造json哈希

发布时间:2020-12-15 22:43:53 所属栏目:安全 来源:网络整理
导读:我想将bash中的关联数组转换为json hash / dict.我更喜欢使用jq来做这个,因为它已经是一个依赖项,我可以依靠它来生成格式良好的json.有人可以演示如何实现这一目标吗? #!/bin/bashdeclare -A dict=()dict["foo"]=1dict["bar"]=2dict["baz"]=3for i in "${!d
我想将bash中的关联数组转换为json hash / dict.我更喜欢使用jq来做这个,因为它已经是一个依赖项,我可以依靠它来生成格式良好的json.有人可以演示如何实现这一目标吗?

#!/bin/bash

declare -A dict=()

dict["foo"]=1
dict["bar"]=2
dict["baz"]=3

for i in "${!dict[@]}"
do
    echo "key  : $i"
    echo "value: ${dict[$i]}"
done

echo 'desired output using jq: { "foo": 1,"bar": 2,"baz": 3 }'

解决方法

有很多可能性,但鉴于您已经编写了一个bash for循环,您可能希望从脚本的这种变体开始:

#!/bin/bash
# Requires bash with associative arrays
declare -A dict

dict["foo"]=1
dict["bar"]=2
dict["baz"]=3

for 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的优点.如果需要,过滤器来自json? //可以省略或替换为另一个.

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","baz": {
    "x": 0
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读