ใช้ jq เพื่อแยกวิเคราะห์สตริง JSON


91

ฉันกำลังพยายามjqแยกวิเคราะห์โครงสร้าง JSON เช่น:

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

นั่นคือองค์ประกอบใน JSON คือสตริงที่มี Escape json

ดังนั้นฉันมีบางอย่างตามแนวของ $ jq [.c] myFile.json | jq [.id]

แต่ที่เกิดปัญหากับ jq: error: Cannot index string with string

เนื่องจากเอาต์พุตของ. c เป็นสตริงไม่ใช่ JSON มากกว่า ฉันจะให้ jq แยกวิเคราะห์สตริงนี้ได้อย่างไร

วิธีการแก้ปัญหาแรกของฉันคือการใช้ sed เพื่อแทนที่ทุกตัวอักษรหลบหนี ( \":\", \",\"และ\") แต่ที่ยุ่งของผมถือว่ามีวิธีที่สร้างขึ้นในjqการทำเช่นนี้?

ขอบคุณ!

แก้ไข: นอกจากนี้เวอร์ชัน jq ที่มีอยู่ที่นี่คือ:

$ jq --version
jq version 1.3

ฉันเดาว่าฉันสามารถอัปเดตได้หากจำเป็น


คำถามนี้ยังช่วยได้หากคุณกำลังมองหา: "วิธี unescape json string โดยใช้ jq?"
k0pernikus

คำตอบ:


172

jq มีfromjsonbuiltin สำหรับสิ่งนี้:

jq '.c | fromjson | .id' myFile.json

fromjson ถูกเพิ่มในเวอร์ชัน 1.4


2
ขอขอบคุณ. นี้ได้ผล ฉันจะยอมรับคำตอบนี้เพราะฉันรู้สึก 'งี่เง่า' มากกว่า ไชโย
Colin Grogan

@ColinGrogan ได้โปรดทำ
vbence

@ColinGrogan: ฉันไม่เห็นเหตุผลใด ๆ ที่จะเปลี่ยนคำตอบที่ยอมรับเนื่องจากคุณเขียนไว้อย่างชัดเจนในคำถามของคุณว่าคุณใช้ jq เวอร์ชัน 1.3 ซึ่งfromjsonฟีเจอร์นี้ไม่มีให้ใช้งาน กล่าวอีกนัยหนึ่งแม้ว่าคำตอบนี้จะน่าสนใจ แต่ก็ไม่ได้ตอบคำถาม
Casimir et Hippolyte

เป็นไปได้ไหมที่จะใช้สิ่งนี้ แต่ในไฟล์ json ทั้งหมด (ไม่ได้ระบุคุณสมบัติ. id)
Florian Castelain

1
@FlorianCastelain ใช่ไม่ว่าจะใช้หรือใช้ dot: jq 'fromjson | .' myfileโดยที่ myfile มี"{\"key\":1, \"word\":\"cat\"}"

42

คุณสามารถใช้เอาต์พุตดิบ (-r) ที่จะคลายสเคปอักขระ:

jq -r .c myfile.json | jq .id

เพิ่มเติม: สิ่งนี้มีข้อดีคือทำงานใน jq 1.3 ขึ้นไป แน่นอนมันควรจะทำงานในทุกเวอร์ชันของ jq ที่มีตัวเลือก -r

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.