จัดการข้อมูล JSON ให้อยู่หมัดด้วย jq
โจทย์ที่ผมต้องทำตอนนี้คือเราต้องดึงข้อมูลมาจาก API ตัวอื่น ซึ่งข้อมูลนี้ก็จะมาในรูปแบบของ JSON (JavaScript Object Notation) นั่นเอง ความหินคือเราต้องการข้อมูลบางส่วน หรือ ไม่ก็ต้องแปลงชื่อฟิลด์ของข้อมูลบางตัว รวมทั้งอาจจะต้อง Transform ค่าบางค่าให้อยู่ในรูปแบบใหม่ที่เราต้องการเก็บ เราจะทำอย่างไรดี?
ผมมีอยู่ 2 ทางเลือกหลัก ๆ ในการแก้โจทย์นี้
- เขียนโปรแกรมขึ้นมาเพื่อทำหน้าที่ในการ Transform ข้อมูลเสีย
- หาโปรแกรมหรือ Lib ที่มีช่วยให้เรา Transform ข้อมูลได้ง่ายขึ้น
ซึ่งปกติแล้วผมก็มักจะใช้ท่าที่ 1 ในการทำงานนั่นแหละครับ แต่ผมก็มานึกได้ว่ามันน่าจะมีเครื่องมือที่มาช่วยเราบ้างซิ เพราะ ในชีวิตการทำงานผมต้องเจอเรื่องนี้มาบ่อยครั้งมาก และเราต้องลงแรงในการเขียนโปรแกรมขึ้นมาเพื่อทำการแปลงข้อมูล ซึ่งใช้เวลาพอสมควร รวมทั้งจุดนี้ทำให้บางครั้งก็เป็นอุปสรรคในการทำงานหลักเสียด้วย กลายเป็นว่าเราต้องใช้เวลาไปกับการแก้ปัญหาที่ไม่ใช่ปัญหาจริง ๆ
จนผมได้มาเจอเข้ากับ jq เครื่องมือที่เคลมตัวเองว่ามันคือเครื่องมือที่ light-weight ในการจัดการเรื่อง JSON ผ่าน Command line ลองนึกภาพว่าในโลกของ Command line มันมีเครื่องมือนึงที่ใช้ในการจัดการข้อมูลที่เป็น String สิ่งนั้นคือ
คือ….
คือ…
มันคือ sed ซึ่งเจ้านี่ก็เคลมว่าเค้าคือ sed ในโลกของ JSON เลย
ซึ่งจากที่ผมทดลองใช้งานในเบื้องต้นแล้วก็พบว่ามันตอบโจทย์อย่างมาก เราสามารถทำอะไรก็ได้กับข้อมูล JSON โดยไม่ต้องลงมือเขียนโปรแกรมเลย
ผมจะข้ามขั้นตอนในการติดตั้งไปครับ ให้ดูวิธีการติดตั้งได้จากที่นี่
สำหรับใครที่ไม่อยากติดตั้งตอนนี้เค้าก็มีเว็บ Sandbox ให้ทดลองใช้งานดูสามารถกดเข้าเข้าได้ที่ลิงค์ด้านล่างนี้เลย
เราจะมาทดลองเล่นคร่าว ๆ กันดูดีกว่า
- การเลือก key นั้นอย่างเดียวมาแสดงผล เราสามารถใช้งาน .ตามด้วย key ที่เราต้องการเลือกมาเลย จากรูป ผมใช้
.foo
นั่นก็คือการเลือกเอา key = foo มาแสดงอย่างเดียวนั่นเอง
นอกจากนี้เรายังสามารถไต่เข้าไปยัง key ลูกได้ด้วย ลองเดาดูว่าทำอย่างไร
ก็ทำการต่อ . ไปเลยครับ จากรูปผมต้องการเอา foo > bar มาแสดง ก็เรียกใช้งานว่า .foo.bar
- หากเราต้องการจัด Format ใหม่ล่ะ ไม่ยากเลย แค่เราทำการสร้าง JSON ก้อนใหม่มารับ จากนั้นใช้ . เพื่อเลือกว่าจะเอาข้อมูลไหนมาลง
จากรูปด้านบน ผมจะทำการแปลงชื่อของ key ให้กลายเป็น newFoo
และ newTest
- เราสามารถใส่ | เพื่อให้เรียกใช้งานฟังก์ชั่นต่าง ๆ ได้
จากรูปด้านบน ผมใช้การหาจำนวนของ Array ใน key=data โดยใช้คำสั่ง length
และอีกมากมายที่เราสามารถทำอะไรก็ได้ผ่าน jq เพื่อทำการแปลง, จัดการข้อมูล หรือ เลือกค่าบางค่ามาใช้งาน ศึกษาต่อได้จากลิงค์ด้านล่างเลยครับ
ด้วยความที่เป็น command line เราก็สามารถใช้งานได้เหมือน sed
นั่นคือเราสามารถเรียกใช้งานได้ร่วมกันกับคำสั่งอื่น ๆ ได้ด้วย เช่น หากเราต้องการไป curl
API มา และต้องการแปลงค่าเราก็สามารถทำได้โดยง่าย เช่น
จะเห็นว่ามันง่ายมากในการใช้งาน แต่เราต้องใช้เวลาศึกษา Syntax ของเจ้านี่ก่อน ถ้าใช้งานได้คล่องจะพบว่าเครื่องมือนี้มันช่วยเราลดเวลาอย่างมาก ทำให้การจัดการกับ JSON ที่เมื่อก่อนเป็นเรื่องแสนน่าเบื่อ กลับกลายเป็นเรื่องสนุกได้ จะได้เอาเวลาไปทำการแก้โจทย์จริง ๆ ของเราดีกว่าเนอะ
เมื่อก่อนผมเบื่อมากกับการแก้โจทย์เดิม ๆ ซึ่งผมได้เจอหลายคนเหมือนกันที่เบื่องานเนื่องจากตัวโจทย์มันก็จะวน ๆ ทำให้ไม่ได้ทดลองเล่นอะไรใหม่เลย แต่พอลองปรับเปลี่ยนมุมมองที่ตัวเราเองนั่นคือ ลองค้นหาวิธีที่มันดีขึ้นในแต่ละครั้งดูครับ ผมชอบหลักการที่ว่า Developer ที่ดี ไม่ใช่มองว่า Make it work (ทำให้มันสำเร็จอย่างเดียว) เราต้องมองไปถึงว่า Make it right (หาขั้นตอนหรือวิธีที่ดีปรับใช้กับงานให้ดีขึ้นกว่าเดิม) จากนั้นเราก็ทำให้มัน Make it fast (Optimize อย่างไรให้งานของเรามันเร็วที่สุด มีตรงไหนที่ปรับให้รีดความเร็วออกมาได้อีกไหม — เรื่องนี้ยากน่ะครับ ไม่ใช่ง่าย ๆ การเลือกใช้เครื่องมือหรือเทคนิคบางอันอาจจะไม่ดีพอสำหรับปัญหาที่เราเจอ)
ลองดูครับ สนุกไปกับการเรียนรู้วิธีใหม่ ๆ กับโจทย์เดิม ๆ คุณจะได้เรียนรู้เรื่องสนุกใหม่ ๆ ในทุกวัน