สับสนเกี่ยวกับ jq parser


3

ฉันพยายามใช้ ตัวแยกวิเคราะห์ jq ในสคริปต์ทุบตีของฉันและฉันสับสนเกี่ยวกับวิธีการทำงานบางคนสามารถอธิบายสิ่งที่ฉันทำผิดหรือเปล่า?

นี่คือไฟล์ต้นฉบับจากบริการภายนอกและฉันต้องได้รับ value จากมัน:

root@test ~ # cat test.json 
{"sensors":[{"id":34585,"value":-3.06,"time":1457031003}]}

พยายามส่งไปที่ jq:

root@test ~ # cat narod.json | jq
{
  "sensors": [
    {
      "id": 34585,
      "value": -3.06,
      "time": 1457031003
    }
  ]
}

พยายามที่จะรับ sensors:

root@test ~ # cat narod.json | jq '.sensors'
[
  {
    "id": 34585,
    "value": -3.06,
    "time": 1457031003
  }
]

พยายามที่จะรับ value จาก sensors:

root@test ~ # cat narod.json | jq '.sensors.value'
jq: error (at <stdin>:0): Cannot index array with string "value"

ลอง jq sensors[].value ไม่ใช่ที่คอมพิวเตอร์ของฉันดังนั้นจึงไม่สามารถทดสอบหรือโพสต์คำตอบแบบเต็ม แต่จะทำในภายหลัง
Phil

มันได้ผล! ขอบคุณมากและคุณสามารถอธิบายหรือให้ลิงค์ที่ฉันผิดได้ไหม?
SimWhite

1
.sensors ในอินพุต JSON ของคุณคือ แถว ไม่ใช่ dict มันไม่ได้ มี ดัชนีเช่น. value - เฉพาะรายการภายในเท่านั้น ดังนั้นคุณต้องบอกให้ jq ใช้ดัชนีกับแต่ละรายการของอาร์เรย์โดยใช้ []
grawity

คำตอบ:


2

ตามที่กล่าวไว้ในความคิดเห็นในกรณีเฉพาะนี้คุณควรใช้:

jq sensors[].value

นี่เป็นเพราะคุณต้องบอก jq เพื่อคาดหวังอาร์เรย์ (แสดงโดย [ ] ) อย่างมีประสิทธิภาพนี้จะพูดว่า 'ค้นหาที่ระดับถัดไปลงในลำดับชั้น'

โดยทั่วไปเมื่อคุณพบอาร์เรย์ ( [ ) ในไฟล์ json ของคุณคุณควรระบุสิ่งนี้ในแบบสอบถามของคุณ: jq array_name[].object_in_array จะคืนเนื้อหาของ object_in_array.


1

สิ่งที่ต้องจำเมื่อทำงานกับอาร์เรย์ JQ คือว่า [] โอเปอเรเตอร์จะแจกแจงค่าแต่ละค่าของอาร์เรย์

 .sensors[].value

ส่งกลับค่า .value ของวัตถุทั้งหมดใน .sensors. มันเทียบเท่ากับตัวกรอง

   .["sensors"]    # choose value of "sensors" key
 | .[]             # enumerate each value
 | .["value"]      # choose value of "value" key

คุณควรต้องการ .value สำหรับวัตถุใดชิ้นหนึ่งบ่อยครั้งที่คุณต้องการรวม เลือก . เช่น.

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