【问题标题】:sh: How to write an array to a json file using jqsh:如何使用 jq 将数组写入 json 文件
【发布时间】:2020-10-29 15:35:02
【问题描述】:

如何将数组写入 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"
}

【问题讨论】:

标签: sh jq


【解决方案1】:

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

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

即使在键或值中使用换行符,它也应该可以工作。需要注意的一点是 技术上 bash 不保证 ${!myarray[@]} 将输出键 in the same order${myarray[@]} 将输出值。它确实在实践中做到了这一点,很难想象一个不会的实现,但是如果你真的想要安全,这里有一个Inian's answer 的变化对换行应该是安全的。它还组装了一个对象。

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'

【讨论】:

  • 不错!但请添加注释$ARGS.positional 是 jq-1.6 的东西
【解决方案2】:

作为jq的替代品:

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

cols=$(printf "%s," "${!myarray[@]}")
column -J --table-name 'myTable' --table-columns "${cols}"  <<<"${myarray[@]}"

【讨论】:

    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多