จัดการข้อมูล JSON ให้อยู่หมัดด้วย jq

Nitipat Lowichakornthikun
I GEAR GEEK
Published in
3 min readDec 14, 2018

โจทย์ที่ผมต้องทำตอนนี้คือเราต้องดึงข้อมูลมาจาก API ตัวอื่น ซึ่งข้อมูลนี้ก็จะมาในรูปแบบของ JSON (JavaScript Object Notation) นั่นเอง ความหินคือเราต้องการข้อมูลบางส่วน หรือ ไม่ก็ต้องแปลงชื่อฟิลด์ของข้อมูลบางตัว รวมทั้งอาจจะต้อง Transform ค่าบางค่าให้อยู่ในรูปแบบใหม่ที่เราต้องการเก็บ เราจะทำอย่างไรดี?

ผมมีอยู่ 2 ทางเลือกหลัก ๆ ในการแก้โจทย์นี้

  1. เขียนโปรแกรมขึ้นมาเพื่อทำหน้าที่ในการ Transform ข้อมูลเสีย
  2. หาโปรแกรมหรือ Lib ที่มีช่วยให้เรา Transform ข้อมูลได้ง่ายขึ้น
เวลา Clean data มักมากกว่า เวลาพัฒนาโปรแกรมจริง ๆ

ซึ่งปกติแล้วผมก็มักจะใช้ท่าที่ 1 ในการทำงานนั่นแหละครับ แต่ผมก็มานึกได้ว่ามันน่าจะมีเครื่องมือที่มาช่วยเราบ้างซิ เพราะ ในชีวิตการทำงานผมต้องเจอเรื่องนี้มาบ่อยครั้งมาก และเราต้องลงแรงในการเขียนโปรแกรมขึ้นมาเพื่อทำการแปลงข้อมูล ซึ่งใช้เวลาพอสมควร รวมทั้งจุดนี้ทำให้บางครั้งก็เป็นอุปสรรคในการทำงานหลักเสียด้วย กลายเป็นว่าเราต้องใช้เวลาไปกับการแก้ปัญหาที่ไม่ใช่ปัญหาจริง ๆ

จนผมได้มาเจอเข้ากับ jq เครื่องมือที่เคลมตัวเองว่ามันคือเครื่องมือที่ light-weight ในการจัดการเรื่อง JSON ผ่าน Command line ลองนึกภาพว่าในโลกของ Command line มันมีเครื่องมือนึงที่ใช้ในการจัดการข้อมูลที่เป็น String สิ่งนั้นคือ

คือ….

คือ…

มันคือ sed ซึ่งเจ้านี่ก็เคลมว่าเค้าคือ sed ในโลกของ JSON เลย

https://stedolan.github.io/jq/

ซึ่งจากที่ผมทดลองใช้งานในเบื้องต้นแล้วก็พบว่ามันตอบโจทย์อย่างมาก เราสามารถทำอะไรก็ได้กับข้อมูล 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 อย่างไรให้งานของเรามันเร็วที่สุด มีตรงไหนที่ปรับให้รีดความเร็วออกมาได้อีกไหม — เรื่องนี้ยากน่ะครับ ไม่ใช่ง่าย ๆ การเลือกใช้เครื่องมือหรือเทคนิคบางอันอาจจะไม่ดีพอสำหรับปัญหาที่เราเจอ)

http://wordpress.transentia.com.au/wordpress/2009/03/25/an-interesting-project/

ลองดูครับ สนุกไปกับการเรียนรู้วิธีใหม่ ๆ กับโจทย์เดิม ๆ คุณจะได้เรียนรู้เรื่องสนุกใหม่ ๆ ในทุกวัน

--

--