Saya membuat objek json dengan skrip dengan jq.
jq -n --arg date "$DATE" --arg script "$SCRIPT" --arg log_level "$LOG_LEVEL" --arg ppid "$PPID" --arg message "$MESSAGE" '{"t":$date, "service":$script, "level":$log_level, "pid":$ppid, "message":$message}'
Variabel log_level dan pesan disediakan oleh skrip lain dan di dalam pesan dapat disimpan string biasa atau string json.
Contoh Json String:
{"text":"value", "text2":"value2"}
Output jika string biasa disediakan:
{
"t": "2017-10-12 16:52:26",
"service": "import.sh",
"level": "INFO",
"pid": "23425",
"message": "START"
}
Output jika objek json disediakan:
{
"t": "2017-10-12 17:01:16",
"service": "import.sh",
"level": "INFO",
"pid": "13069",
"message": "{\"text\":\"value\", \"text2\":\"value2\"}"
}
Apa yang saya harapkan jika saya memberikan objek json:
{
"t": "2017-10-12 17:01:16",
"service": "cis_import.sh",
"level": "INFO",
"pid": "13069",
"message": {
"text": "value",
"text2": "value2"
}
}
Apakah saya benar bahwa jq menambahkan \
untuk setiap "
karena akan ditambahkan ke objek json seperti itu akan menjadi string sederhana?
Bagaimana saya bisa mendapatkan json yang saya harapkan?
1 menjawab
Akhirnya mengerti. Terima kasih atas petunjuknya chepner dan blusky
Untuk memvalidasi apakah $MESSAGE
adalah json, saya menggunakan jq -n $MESSAGE
lihat manual jq a> bukannya jq . /path/to/file.json
Untuk menggunakan --argjson
yang disebutkan, saya akan menambahkan "
di sekitar $MESSAGE
jika $MESSAGE adalah string biasa MESSAGE="\"$MESSAGE\""
. Saya melakukan ini dengan DATE, SCRIPT, LOG_LEVEL, PPID juga.
Perintah untuk membuat objek json terlihat seperti ini:
jq -cn --argjson date "$DATE" --argjson script "$SCRIPT" --argjson log_level "$LOG_LEVEL" --argjson ppid "$PPID" --argjson message "$MESSAGE" '{"t":$date, "service":$script, "level":$log_level, "pid":$ppid, "message":$message}'
--argjson
darijq
?message
berisi string atau objek JSON sebelum Anda dapat memutuskan apakah Anda memerlukan--arg
atau--argjson
. Akan lebih mudah jika Anda dapat memastikan bahwa apa pun yang menyediakanmessage
selalu mengembalikan nilai JSON yang tepat (artinya mungkin mengembalikan"START"
alih-alihSTART
). Kemudian Anda dapat menggunakan--argjson
tanpa syarat.jq . /path/to/file.json
Dengan ini saya lakukan--arg v "$variable
jika ini adalah string sederhana atau saya lakukan--slurpfile v /path/to/file.json
Jika memungkinkan saya ingin tetap berada di shell dan tidak menulis file dan menghapusnya nanti."
ke variabel, sehingga terlihat seperti ini"START"
dan menggunakan--argjson v $variable
. hasilnya terlihat seperti ini sekarang:{"t":"2017-10-13 09:52:02","service":"import.sh","level":"INFO","pid":"4566","message":["START"]}