Estou usando as ferramentas jq (jq-json-processor) no shell script para analisar o json.
Eu tenho 2 arquivos json e quero mesclá-los em um único arquivo
Aqui o conteúdo dos arquivos:
file1
{
"value1": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value1": "v1",
"value2": "v2"
},
"bbb": {
"value1": "v1",
"value2": "v2"
},
"ccc": {
"value1": "v1",
"value2": "v2"
}
}
}
arquivo2
{
"status": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value3": "v3",
"value4": 4
},
"bbb": {
"value3": "v3"
},
"ddd": {
"value3": "v3",
"value4": 4
}
}
}
resultado esperado
{
"value": {
"aaa": {
"value1": "v1",
"value2": "v2",
"value3": "v3",
"value4": 4
},
"bbb": {
"value1": "v1",
"value2": "v2",
"value3": "v3"
},
"ccc": {
"value1": "v1",
"value2": "v2"
},
"ddd": {
"value3": "v3",
"value4": 4
}
}
}
Eu tento muitas combinações, mas o único resultado que recebo é o seguinte, que não é o resultado esperado:
{
"ccc": {
"value2": "v2",
"value1": "v1"
},
"bbb": {
"value2": "v2",
"value1": "v1"
},
"aaa": {
"value2": "v2",
"value1": "v1"
}
}
{
"ddd": {
"value4": 4,
"value3": "v3"
},
"bbb": {
"value3": "v3"
},
"aaa": {
"value4": 4,
"value3": "v3"
}
}
Usando este comando:
jq -s '.[].value' file1 file2
json
shell
command-line
jq
Janfy
fonte
fonte
json
uso:cat f1 f2 | json --deep-merge
json
@ xer0x?json
movimento ferramenta para github.com/trentm/jsonRespostas:
Desde 1.4, isso agora é possível com o
*
operador. Quando dados dois objetos, eles serão mesclados recursivamente. Por exemplo,Importante: Observe o
-s (--slurp)
sinalizador, que coloca os arquivos na mesma matriz.Você:
Se você também deseja se livrar das outras chaves (como o resultado esperado), uma maneira de fazer isso é:
Ou o presumivelmente um pouco mais eficiente (porque não mescla outros valores):
fonte
-s
sinalizador é importante, pois sem ele os dois objetos não estão em uma matriz.Use
jq -s add
:Isso lê todos os textos JSON do stdin em uma matriz (
jq -s
faz isso) e depois os "reduz".(
add
é definido comodef add: reduce .[] as $x (null; . + $x);
, que itera sobre os valores da matriz de entrada / objeto e os adiciona. Adição de objeto == mesclagem.)fonte
reduce .[] as $x ({}; . * $x)
- veja também a resposta de jrib .Quem sabe se você ainda precisa, mas aqui está a solução.
Depois de chegar à
--slurp
opção, é fácil!Em seguida, o
+
operador fará o que você deseja:(Nota: se você deseja mesclar objetos internos em vez de substituir apenas os arquivos da esquerda pelos arquivos da direita, será necessário fazê-lo manualmente)
fonte
Aqui está uma versão que funciona recursivamente (usando
*
) em um número arbitrário de objetos:fonte
jq -s 'reduce .[] as $item ({}; . * $item)' *.json
Primeiro, {"value": .value} pode ser abreviado para apenas {value}.
Segundo, a opção --argfile (disponível nas versões 1.4 e 1.5) pode ser interessante, pois evita o uso da opção --slurp.
Juntando isso, os dois objetos nos dois arquivos podem ser combinados da maneira especificada da seguinte maneira:
O sinalizador '-n' diz ao jq para não ler no stdin, pois as entradas são provenientes das opções --argfile aqui.
fonte
--argile
por--slurpfile
Isso pode ser usado para mesclar qualquer número de arquivos especificados no comando:
jq -rs 'reduce .[] as $item ({}; . * $item)' file1.json file2.json file3.json ... file10.json
ou isso para qualquer número de arquivos
jq -rs 'reduce .[] as $item ({}; . * $item)' ./*.json
fonte