Saya menggunakan alat jq (jq-json-processor) dalam skrip shell untuk mengurai json.
Saya punya 2 file json dan ingin menggabungkannya menjadi satu file unik
Berikut isi file:
file1
{
"value1": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value1": "v1",
"value2": "v2"
},
"bbb": {
"value1": "v1",
"value2": "v2"
},
"ccc": {
"value1": "v1",
"value2": "v2"
}
}
}
file2
{
"status": 200,
"timestamp": 1382461861,
"value": {
"aaa": {
"value3": "v3",
"value4": 4
},
"bbb": {
"value3": "v3"
},
"ddd": {
"value3": "v3",
"value4": 4
}
}
}
Hasil yang diharapkan
{
"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
}
}
}
Saya mencoba banyak kombinasi tetapi satu-satunya hasil yang saya dapatkan adalah sebagai berikut, yang bukan hasil yang diharapkan:
{
"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"
}
}
Menggunakan perintah ini:
jq -s '.[].value' file1 file2
json
shell
command-line
jq
Janfy
sumber
sumber
json
menggunakan:cat f1 f2 | json --deep-merge
json
@ xer0x?json
alatnya, buka github.com/trentm/jsonJawaban:
Sejak 1.4 ini sekarang dimungkinkan dengan
*
operator. Ketika diberi dua objek, itu akan menggabungkannya secara rekursif. Sebagai contoh,Penting: Perhatikan
-s (--slurp)
bendera, yang menempatkan file dalam larik yang sama.Akan membuat Anda:
Jika Anda juga ingin menyingkirkan kunci lain (seperti hasil yang Anda harapkan), salah satu cara untuk melakukannya adalah ini:
Atau mungkin agak lebih efisien (karena tidak menggabungkan nilai lain):
sumber
-s
bendera penting karena tanpanya kedua objek tidak berada dalam array.Penggunaan
jq -s add
:Ini membaca semua teks JSON dari stdin ke dalam array (
jq -s
melakukan itu) lalu "mengurangi" mereka.(
add
didefinisikan sebagaidef add: reduce .[] as $x (null; . + $x);
, yang melakukan iterasi di atas nilai / objek larik masukan dan menambahkannya. Penambahan objek == penggabungan.)sumber
reduce .[] as $x ({}; . * $x)
- lihat juga jawaban jrib .Siapa tahu Anda masih membutuhkannya, tetapi inilah solusinya.
Begitu Anda mendapatkan
--slurp
opsi, itu mudah!Kemudian
+
operator akan melakukan apa yang Anda inginkan:(Catatan: jika Anda ingin menggabungkan objek dalam daripada hanya menimpa file kiri dengan file kanan, Anda perlu melakukannya secara manual)
sumber
Berikut adalah versi yang bekerja secara rekursif (menggunakan
*
) pada sejumlah objek yang berubah-ubah:sumber
jq -s 'reduce .[] as $item ({}; . * $item)' *.json
Pertama, {"value": .value} dapat disingkat menjadi {value}.
Kedua, opsi --argfile (tersedia di jq 1.4 dan jq 1.5) mungkin menarik karena menghindari keharusan menggunakan opsi --slurp.
Dengan menggabungkan ini, dua objek di dua file dapat digabungkan dengan cara yang ditentukan sebagai berikut:
Bendera '-n' memberitahu jq untuk tidak membaca dari stdin, karena input berasal dari opsi --argfile di sini.
sumber
--argile
untuk--slurpfile
Ini dapat digunakan untuk menggabungkan sejumlah file yang ditentukan pada perintah:
jq -rs 'reduce .[] as $item ({}; . * $item)' file1.json file2.json file3.json ... file10.json
atau ini untuk sejumlah file
jq -rs 'reduce .[] as $item ({}; . * $item)' ./*.json
sumber