nitip.at

nitip.at

จัดการข้อมูล JSON ไม่ใช่เรื่องยากด้วย jq

จัดการข้อมูล JSON ไม่ใช่เรื่องยากด้วย jq

Nitipat Lowichakornthikun's photo
Nitipat Lowichakornthikun
·Dec 14, 2018·

2 min read

โจทย์ที่ผมต้องทำตอนนี้คือเราต้องดึงข้อมูลมาจาก 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 ให้ทดลองใช้งานดูสามารถกดเข้าเข้าได้ที่ลิงค์ด้านล่างนี้เลย

jq play
Edit description
jqplay.org

เราจะมาทดลองเล่นคร่าว ๆ กันดูดีกว่า

  • การเลือก key นั้นอย่างเดียวมาแสดงผล เราสามารถใช้งาน .ตามด้วย key ที่เราต้องการเลือกมาเลย จากรูป ผมใช้ .foo นั่นก็คือการเลือกเอา key = foo มาแสดงอย่างเดียวนั่นเอง

นอกจากนี้เรายังสามารถไต่เข้าไปยัง key ลูกได้ด้วย ลองเดาดูว่าทำอย่างไร

ก็ทำการต่อ . ไปเลยครับ จากรูปผมต้องการเอา foo > bar มาแสดง ก็เรียกใช้งานว่า .foo.bar

  • หากเราต้องการจัด Format ใหม่ล่ะ ไม่ยากเลย แค่เราทำการสร้าง JSON ก้อนใหม่มารับ จากนั้นใช้ . เพื่อเลือกว่าจะเอาข้อมูลไหนมาลง

จากรูปด้านบน ผมจะทำการแปลงชื่อของ key ให้กลายเป็น newFoo และ newTest

  • เราสามารถใส่ | เพื่อให้เรียกใช้งานฟังก์ชั่นต่าง ๆ ได้

จากรูปด้านบน ผมใช้การหาจำนวนของ Array ใน key=data โดยใช้คำสั่ง length

และอีกมากมายที่เราสามารถทำอะไรก็ได้ผ่าน jq เพื่อทำการแปลง, จัดการข้อมูล หรือ เลือกค่าบางค่ามาใช้งาน ศึกษาต่อได้จากลิงค์ด้านล่างเลยครับ

jq Manual (development version)
Some filters produce multiple results, for instance there's one that produces all the elements of its input array…
stedolan.github.io

ด้วยความที่เป็น 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/

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

 
Share this