ฉันคุ้นเคยกับ "jq" สำหรับการแยกวิเคราะห์ json
ฉันทำงานกับหนึ่งบริการที่สร้างการตอบสนอง json โดยที่คุณสมบัติอย่างใดอย่างหนึ่งคือสตริง json ฉันจะแปลงค่าที่ยกมาเป็นสตริง json ที่ถูกต้องเพื่อให้ฉันสามารถประมวลผลด้วย jq ได้อย่างไร
ตัวอย่างเช่นหากฉันเพิ่งดู json ที่พิมพ์สวยแบบธรรมดาจาก "jq." นี่เป็นข้อความที่ตัดตอนมาสั้น ๆ ของผลลัพธ์:
"someJsonString": "{\"date\":\"2018-01-08\", ...
ฉันสามารถใช้ jq เพื่อรับค่าของคุณสมบัตินั้น แต่ฉันต้องแปลงสตริงที่ยกมาเพื่อ json ที่ถูกต้องโดย "unescaping" มัน
ฉันคิดว่าฉันสามารถแปะไปที่ sed ลบการเปิดและสิ้นสุดเครื่องหมายคำพูดคู่และลบเครื่องหมายแบ็กสแลชทั้งหมด (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'
") ดูเหมือนว่าจะใช้งานได้ แต่ไม่ได้ดูเหมือนโซลูชันที่แข็งแกร่งที่สุด
อัปเดต :
เพื่อให้ชัดเจนขึ้นเกี่ยวกับสิ่งที่ฉันทำนี่เป็นตัวอย่างสองสามตัวอย่างที่แสดงสิ่งที่ฉันได้ลอง:
% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...
อัปเดต :
นี่เป็นตัวอย่างแบบสแตนด์อโลนอย่างสมบูรณ์:
% cat stuff.json | jq .
{
"stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"
อัปเดต :
ถ้าฉันพยายามประมวลผลเอาต์พุตสุดท้ายด้วยนิพจน์ jq จริงมันทำอะไรเช่นนี้:
% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)
echo $(jq statement here)
ล่ะ
jq
จะได้รับเพียงแค่มูลค่าของทรัพย์สินสตริงไม่ก็กลับไปใช้ Escape?jq
ถ้าเป็นเช่นนั้นเพียงท่อที่เป็นสด