首页 > 解决方案 > JSON 子数组到 Bash 关联数组

问题描述

我有这个带有测量数据的 JSON:

{
 "errorCode":0,
"statusDataInfo":{
  "function-status-text-005":{
     "textValue":"2006-0310",
     "type":"basic-text"
  },
  "function-status-text-027":{
     "type":"simple-value",
     "value":"50"
  },
  "function-status-text-049":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-025":{
     "type":"simple-value",
     "value":"43"
  },
  "function-status-text-047":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-068":{
     "type":"simple-value",
     "value":"0"
  },
  "function-status-text-009":{
     "type":"simple-value",
     "value":"22"
  },
  "function-status-text-007":{
     "textValue":"2006-0325",
     "type":"basic-text"
  },
  "function-status-text-029":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-041":{
     "textValue":"2006-0960",
     "type":"basic-text"
  },
  "function-status-text-063":{
     "type":"simple-value",
     "value":"3"
  },
  "function-status-text-060":{
     "type":"simple-value",
     "value":"67"
  },
  "function-status-text-023":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-045":{
     "textValue":"2006-0300",
     "type":"basic-text"
  },
  "function-status-text-021":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-043":{
     "textValue":"2006-0300",
     "type":"basic-text"
  },
  "function-status-text-065":{
     "type":"simple-value",
     "value":"0"
  },
  "function-status-text-015":{
     "type":"simple-value",
     "value":"0"
  },
  "function-status-text-037":{
     "type":"simple-value",
     "value":"1550"
  },
  "function-status-text-058":{
     "type":"simple-value",
     "value":"163"
  },
  "function-status-text-013":{
     "type":"simple-value",
     "value":"22"
  },
  "function-status-text-035":{
     "type":"simple-value",
     "value":"11.22"
  },
  "function-status-text-019":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-017":{
     "type":"simple-value",
     "value":"24"
  },
  "function-status-text-039":{
     "textValue":"2006-0940",
     "type":"basic-text"
  },
  "function-status-text-051":{
     "type":"simple-value",
     "value":""
  },
  "function-status-text-056":{
     "type":"simple-value",
     "value":"0"
  },
  "function-status-text-011":{
     "type":"simple-value",
     "value":"22"
  },
  "function-status-text-031":{
     "type":"simple-value",
     "value":"19"
  },
  "function-status-text-053":{
     "type":"simple-value",
     "value":"-"
      }
   },
   "statusBackgroundDataInfo":{
  "0xA0":{
     "value":"0"
  },
  "0x20":{
     "value":"0"
  },
  "0xE1":{
     "value":"0"
  },
  "0xE0":{
     "value":"1"
  },
  "0xFA":{
     "value":"0"
  },
  "0xF0":{
     "value":"1"
  },
  "0x80":{
     "value":"1"
  },
  "0xF9":{
     "value":"1"
  },
  "0xC4":{
     "value":"0"
     }
  }
}

我想要的是一个由它组成的 bash 关联数组,我可以像这样访问 JSON 中的值:

myArray[function-status-text-005][type]
myArray[function-status-text-005][value]

我尝试了 Stackoverflow 和网络上的许多解决方案,但我无法使用任何解决方案。任何帮助,将不胜感激

亲切的问候

编辑

我在这个 Stackoverflow 链接中尝试了解决方案,但它不起作用。它需要一个顶级阵列,而我的则是整齐的statusDataInfo

EDIT2 感谢@Cyrus,我更进一步:

jsonValues=$(cat data.json | jq -r '.statusDataInfo | to_entries|map("\(.key)=\(.value)")|.[]')

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

准备好进入一个 assoc 数组,但它只有一个键,对应的值包含来自 json 的所有信息:

key  : 0
value: function-status-text-005={"textValue":"2006-0310","type":"basic-text"}
function-status-text-027={"type":"simple-value","value":"50"}
 function-status-text-049={"type":"simple-value","value":""}
 function-status-text-025={"type":"simple-value","value":"43"}
 function-status-text-047={"type":"simple-value","value":""}
 function-status-text-068={"type":"simple-value","value":"0"}
 function-status-text-009={"type":"simple-value","value":"22"}
 function-status-text-007={"textValue":"2006-0325","type":"basic-text"}
 function-status-text-029={"type":"simple-value","value":""}
 function-status-text-041={"textValue":"2006-0960","type":"basic-text"}
 function-status-text-063={"type":"simple-value","value":"3"}
 function-status-text-060={"type":"simple-value","value":"67"}
 function-status-text-023={"type":"simple-value","value":""}
 function-status-text-045={"textValue":"2006-0300","type":"basic-text"}
 function-status-text-021={"type":"simple-value","value":""}
 function-status-text-043={"textValue":"2006-0300","type":"basic-text"}
 function-status-text-065={"type":"simple-value","value":"0"}
 function-status-text-015={"type":"simple-value","value":"0"}
 function-status-text-037={"type":"simple-value","value":"1550"}
 function-status-text-058={"type":"simple-value","value":"163"}
 function-status-text-013={"type":"simple-value","value":"22"}
 function-status-text-035={"type":"simple-value","value":"11.22"}
 function-status-text-019={"type":"simple-value","value":""}
 function-status-text-017={"type":"simple-value","value":"24"}
 function-status-text-039={"textValue":"2006-0940","type":"basic-text"}
 function-status-text-051={"type":"simple-value","value":""}
 function-status-text-056={"type":"simple-value","value":"0"}
 function-status-text-011={"type":"simple-value","value":"22"}
 function-status-text-031={"type":"simple-value","value":"19"}
 function-status-text-053={"type":"simple-value","value":"-"}

标签: jsonbashjq

解决方案


myArray[function-status-text-005][type]

myArray[function-status-text-005][value]

我尝试了 Stackoverflow 和网络上的许多解决方案,但我无法使用任何解决方案

这是因为 bash 不支持这种索引,如下所示:

$ echo $BASH_VERSION
5.0.7(1)-release
$ declare -A ary
$ ary["a"]=("x" "y z")
bash: ary["a"]: cannot assign list to array member

有关“解决方法”和替代方法,请参见例如

Bash 中的多维数组

由于您的数据只有两种“类型”,您可能需要考虑最简单的选项之一:拥有两个关联数组。所以不要写:

myArray[function-status-text-005][type]

你会写这样的东西:

type[function-status-text-005]

推荐阅读