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?

0
onionknight 12 Oktober 2017, 18:04
1
Sudahkah Anda mencoba menggunakan --argjson dari jq ?
 – 
Blusky
12 Oktober 2017, 18:13
1
Perhatikan bahwa Anda harus mengetahui apakah 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 menyediakan message selalu mengembalikan nilai JSON yang tepat (artinya mungkin mengembalikan "START" alih-alih START). Kemudian Anda dapat menggunakan --argjson tanpa syarat.
 – 
chepner
12 Oktober 2017, 19:38
Apakah ada cara untuk memvalidasi variabel Shell dengan jq? Saya baru saja menemukan cara untuk memvalidasi jika konten file adalah json. 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.
 – 
onionknight
13 Oktober 2017, 10:42
Saya menambahkan " 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"]}
 – 
onionknight
13 Oktober 2017, 10:56

1 menjawab

Jawaban Terbaik