Eu tenho uma saída JSON que contém uma lista de objetos armazenados em uma variável. (Eu posso não estar falando isso direito)
[
{
"item1": "value1",
"item2": "value2",
"sub items": [
{
"subitem": "subvalue"
}
]
},
{
"item1": "value1_2",
"item2": "value2_2",
"sub items_2": [
{
"subitem_2": "subvalue_2"
}
]
}
]
Eu preciso de todos os valores do item2 em uma matriz para que um script bash seja executado no ubuntu 14.04.1.
Encontrei várias maneiras de obter todo o resultado em uma matriz, mas não apenas os itens de que preciso
jq . <<< "$json"
shell-lo de (bash) relacionado, não específica parajq
arr=( $(...) )
jq
comando, mas por favor, não analise a saída do comando em uma matriz comarr=( $(...) )
(mesmo que funcione com a entrada de amostra): ele não funciona como planejado com espaço em branco incorporado ou à esquerda / à direita e pode resultar em globbing acidental.Na verdade, o seguinte é um bug:
Em vez disso, use:
... ou melhor ainda ...
fonte
Graças ao sputnick, cheguei a isso:
O JSON que eu tenho é a saída de uma API. Tudo o que eu precisava fazer foi remover o argumento do arquivo e canalizar
|
a saída de curl para jq. Funciona muito bem e salvou alguns passos.fonte
*
- ele será substituído por uma lista de arquivos em seu diretório atual.item2
valor com espaço em branco se tornaria mais de um elemento da matriz.como uma alternativa fácil, consulte a
jtc
ferramenta (em https://github.com/ldn-softdev/jtc ) para obter a mesma coisa (como no exemplo do jq):explicação sobre a
-w
opção: colchetes angulares<...>
especificam a busca json inteira, o sufixol
instrui a procurar rótulos em vez de valores,+0
instrui a encontrar todas as ocorrências (em vez de apenas a primeira).fonte
arr=( $(jq ...) )
respostas, na medida em que o conteúdo está sendo dividido por cadeias e expandido para preencher a matriz - espaços de significado (não apenas novas linhas) criam novos elementos, e elementos que parecem uma expressão glob são substituídos por arquivos que expressão corresponde.