【问题标题】:How to construct associative Bash array from JSON hash? [duplicate]如何从 JSON 哈希构造关联 Bash 数组? [复制]
【发布时间】:2019-11-22 17:26:59
【问题描述】:

这个问题与Constructing a json hash from a bash associative array 正好相反。给定以下 JSON:

{
    "a": "z",
    "b": "y",
    "c": "x"
}

我想要一个关联 Bash 数组。

【问题讨论】:

    标签: arrays json bash jq associative-array


    【解决方案1】:

    NUL 分隔的流是最安全的方法:

    input='{"a":"z","b":"y","c":"x"}'
    declare -A data=()
    
    while IFS= read -r -d '' key && IFS= read -r -d '' value; do
        data[$key]=$value
    done < <(jq -j 'to_entries[] | (.key, "\u0000", .value, "\u0000")' <<<"$input")
    

    注意jq -j 的使用,它禁止引用(如-r),但禁止项目之间的隐式换行,让我们手动插入NUL。

    请参阅https://github.com/stedolan/jq/issues/1271 中的讨论(明确请求以 NUL 分隔的输出模式的票证),其中首先建议使用此成语。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      while IFS=':' read k v 
      do 
          dict[$k]="$v"
      done <<< "$( sed -E "s/(\"|,|{|})//g; /^ *$/d; s/^ *//g" input.txt )"
      
      echo "The value of key 'a' is : ${dict[a]}"
      

      希望对你有帮助!

      【讨论】:

      • 这仅适用于格式与最初给出的完全相同的 JSON,并且仅适用于具有非 POSIX 定义的 -E 参数的 sed。您的 JSON 在一行上有多个键/值对?不会工作。您的 JSON 在键名或值中有空格?不会工作。你的 JSON 有反斜杠转义的文字引号?不会工作。您的 JSON 在字符串中有文字 {s?他们消失了。等等。
      • 是的。我知道。但所有这些情况都不是问题中给出的输入。只要给定的输入是所示的,它将起作用。
      • 如果 OP 只想要对问题中的特定输入有用的东西,那么你可以回答 declare -A dict=( [a]="z" [b]="y" [c]="x" )。显然那是无用/荒谬的; 通常的答案必须是好的,而不仅仅是单个样本输入。
      • 这个讨论可能会一直持续下去,我知道我的回答只适用于他非常具体的用例。但是对于他想要实现的目标,我可以想象他的目标非常简单,否则你为什么要使用 Bash 和 JQ 来做到这一点?为什么他要使用完全不合适的工具来完成这项任务?因为 OP 肯定只是想要一个快速而肮脏的解决方案来解决特定任务并继续做其他事情。如果他真的想要一种可靠的方式来处理 json 数据,他将使用某种编程语言而不是命令行魔法。
      • 一个 bash 关联数组可以处理 any map[string]string,只要键和值都是 C 字符串(也就是说,不包含 NUL)。 jq 同样可以处理 任何 有效的 JSON —— 它本身就是一种非常强大的编程语言,并且在需要嵌套数据结构操作的情况下,它比 bash 强大得多。也就是说——当然,所选择的工具隐含着领域限制;但这不是在顶部添加您自己的任意限制的理由或借口,尤其是而不公开它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 2011-03-09
      • 2011-05-11
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多