JSON Sub-Array to Bash Ассоциативная Arra - PullRequest
0 голосов
/ 21 октября 2019

У меня есть этот 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 , но это не такработай. Ему нужен массив верхнего уровня, а мой - neatens в 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

, готовый кАссоциированный массив, НО он имеет только один ключ с соответствующим значением, содержащим всю информацию из 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":"-"}

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Как указано, bash не поддерживает 2-мерный массив. Тогда как насчет двух массивов: type[] и value[].
Не могли бы вы попробовать следующее:

#!/bin/bash

declare -A type value
pat='^(.+)=\{"([^"]*)":"([^"]*)","([^"]*)":"([^"]*)"\}'
while IFS= read -r line; do
    if [[ $line =~ $pat ]]; then
        key="${BASH_REMATCH[1]}"
        if [[ ${BASH_REMATCH[2]} = "type" ]]; then
            type[$key]="${BASH_REMATCH[3]}"
            value[$key]="${BASH_REMATCH[5]}"
        else
            type[$key]="${BASH_REMATCH[5]}"
            value[$key]="${BASH_REMATCH[3]}"
        fi
    fi
done < <(jq -r '.statusDataInfo|to_entries|map("\(.key)=\(.value|tostring)")|.[]' file.json)

# show the contents of the arrays
for i in "${!type[@]}"; do
    printf "%s = %s, %s\n" "$i" "${type[$i]}" "${value[$i]}"
done

Надеюсь, это поможет.

1 голос
/ 21 октября 2019

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]
...