Une uma matriz para criar JSON dinamicamente

2

Declarar JSON no bash é meio chato porque você tem que escapar de muitos personagens.

Digamos que eu tenha uma matriz como esta:

 value1="foo"
 value2="bar"
 arr=("key1" "$value1" "key2" "$value2")

Existe uma maneira de, de alguma forma, entrar na matriz com caracteres ":" e ",".

A única coisa em que consigo pensar é um loop onde você adiciona os caracteres certos, algo assim:

data="";

for i in "${arr[@]}"; do
    data="$data\"$i\""
done
    
por Alexander Mills 21.04.2018 / 02:22

2 respostas

1

Assumindo que a matriz esteja correta:

echo '['
printf '{"%s": "%s"},\n' "${arr[@]}" | sed '$s/,$//'
echo ']'

O comando sed remove a vírgula do final da última linha.

Em seguida, passe isso para jq para formatá-lo corretamente:

{
    echo '['
    printf '{"%s": "%s"},\n' "${arr[@]}" | sed '$s/,$//'
    echo ']'
} | jq .

Com os dados fornecidos, isso produz

[
  {
    "key1": "foo"
  },
  {
    "key2": "bar"
  }
]

Isso obviamente tratará todos os valores como strings, que também são o que eles estão no shell.

    
por 21.04.2018 / 09:59
1

Acontece que o heredoc pode ser a melhor maneira de declarar o JSON dinâmico, mas eu não sabia sobre essa técnica quando desenvolvi o seguinte.

Esta é uma solução, use assim:

join_arry_to_json a b c d
{"a":"b","c":"d"}

isso só funcionará para strings, não para números ou booleanos. Agora, para declarar um booleano ou um número, use o símbolo ^ :

ql_join_arry_to_json a ^3 b ^true c dog

rendimentos:

{"a":3,"b":true,"c":"dog"}

o código está aqui: link

    
por 21.04.2018 / 02:32