首页 > 解决方案 > sh:如何使用 jq 将数组写入 json 文件

问题描述

如何将数组写入 json 文件?

#!/bin/sh
declare -A myarray 
myarray["testkey"]="testvalue"
myarray["testkey1"]="testvalue1"
myarray["testkey2"]="testvalue2"

jq -n --arg $myarray[@] > file.json

编辑:

json 文件应包含以下内容:

{
  "testkey": "testvalue",
  "testkey1": "testvalue1", 
  "testkey2": "testvalue2"
}

标签: shjq

解决方案


这是一种在序列化关联数组之前不需要额外步骤的方法:

jq -n '
    $ARGS.positional|
    . as $a|
    (length/2) as $l|
    [range($l)|{key:$a[.],value:$a[.+$l]}]|
    from_entries' --args "${!myarray[@]}" "${myarray[@]}"

它甚至可以在键或值中使用换行符。需要注意的是,从技术上讲, bash 并不能保证${!myarray[@]}输出键的顺序${myarray[@]}输出值的顺序相同。它在实践中确实做到了这一点,很难想象一个不会这样做的实现但如果你真的想要安全的话,这里有一个Inian 答案的变体,它应该对换行符是安全的。它还组装了一个对象。

for key in "${!myarray[@]}"; do 
    printf "%s\0%s\0" "$key" "${myarray[$key]}"
done | 
jq -sR '
    split("\u0000")|
    . as $elements|
    [range(length/2)|{key:$elements[2*.],value:$elements[2*.+1]}]|
    from_entries'

推荐阅读