/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day37] JSON

วันที่สามสิบเจ็ดของ ‪#‎365วันแห่งโปรแกรม วันนี้ขอนำเสนอเรื่อง JSON


ท่านที่เคยเคนโปรแกรมเชื่อมต่อกับ Web Service ก็น่าจะรู้จัก JSON กันใช่ไหมครับ JSON นั้นย่อมาจาก JavaScript Object Notation เป็นฟอร์แมตข้อมูลที่ใช้สำหรับแลกเปลี่ยนกันข้ามโปรแกรม/อุปกรณ์ ซึ่งออกแบบมาให้อ่านและเขียนได้ง่าย รวมไปถึงมีขนาดเล็ก (overhead น้อยลง เมื่อเทียบกับ XML) แต่เดิมนั้น JSON เป็นส่วนหนึ่งของ JavaScript มาก่อน และต่อมาก็ได้พัฒนาเป็นฟอร์แมตที่ไม่ได้ขึ้นกับภาษาใดๆ และกลายเป็นทางเลือกใหม่ในการรับส่งข้อมูลแทนที่ XML

JSON ถูกสร้างขึ้นมาโดยใช้โครงสร้าง 2 แบบ คือ

  • Collection ของคู่ name/value ซึ่ง name ก็คือ string ธรรมดา ส่วน value ก็อาจจะเป็น data type ต่างๆ รวมไปถึง Collection อื่น และ List ด้วย ในภาษาโปรแกรมก็อาจจะเทียบได้กับ Object, Struct, Record, Dictionary, Map, Table, etc.

  • List ของ value อันนี้จะต่างจากข้อบนที่มีแต่ value อย่างเดียวเลย มีขนาดเท่าไหร่ก็ได้ ซึ่งเราก็อาจจะมองว่ามันเป็น Array, List, Vector, Sequence

ด้วยโครงสร้าง 2 แบบนี้ ทำให้เราสามารถใช้ JSON เก็บข้อมูลได้แทบทุกแบบ และง่ายในการ implement บนภาษาโปรแกรมต่างๆ

การสร้าง JSON

โดยทั่วไปแล้วเราจะมอง JSON เป็น object (โครงสร้างแบบ collection ของ name/value) และ array (โครงสร้างแบบ List ของ value) ซึ่งทั้งสองอย่างจะมีข้อกำหนดในการเขียนต่างกันนิดหน่อย

JSON object จะมีสมาชิกข้างในเป็น name/value และไม่สนใจลำดับของสมาชิกแต่ละตัว JSON object นั้นจะเริ่มด้วย left brace ({) และจบด้วย right brace (}) เสมอ ส่วนสมาชิกข้างในนั้นจะมี name เป็น string ตามด้วยเครื่องหมาย colon (:) และตามด้วย value ของมัน หากมีสมาชิกหลายตัวจะคั่นระหว่างสมาชิกด้วยเครื่องหมาย comma (,)

JSON object

JSON array จะมีสมาชิกข้างในเป็น value ล้วนๆ โดยการสร้าง array จะต้องเปิดด้วยเครื่องหมาย left bracket ([) และปิดด้วยเครื่องหมาย right bracket (])

JSON array

โดยทั่วไปแล้วเราสามารถสร้าง heterogeneous array (array ที่มีสมาชิกหลาย data type)ได้ แต่ในความเป็นจริงแล้วเ้ป็นสิ่งที่ไม่ควรทำอย่างยิ่ง เพราะจะทำให้เกิดปัญหาในการทำ deserialization ในหลายๆ ภาษาโปรแกรม

แล้ว value นี้เป็นค่าอะไรได้บ้าง

value สามารถเป็นได้ทั้ง string, number, boolean (true, false), null หรือแม้กระทั่ง JSON object หรือ JSON array ด้วย

JSON array

string ก็เหมือนในภาษาโปรแกรมต่างๆ คือประกอบไปด้วย Unicode character ตั้งแต่ 0 ตัว หรือมากกว่า string นี้จำเป็นต้องอยุ่ในเครื่องหมาย double qoutes ("") เพื่อให้รู้ว่าเป้น string ซึ่งก็ไม่ต่างจากในภาษาโปรแกรมต่างๆ และก็สามารถใช้ backslash escapes ได้อีกด้วย

JSON string

number ก็คือตัวเลขซึ่งอาจจะเป็นจำนวนเต็มก็ได้ เป็นจำนวนที่มีทศนิยมก็ได้ แต่จะไม่มีการใช้เลขฐาน 8 หรือเลขฐาน 16

JSON number

อีกเรื่องนึงคือใน JSON ไม่มี data type ชนิด date/time ครับ ซึ่งผมว่าข้อมูลนี้ควรเป็บเป็น string ตาม format มาตรฐานของ date/time เช่น ISO 8601 และแนะนำว่าไม่จะจะเก็บเป็น format ไหน ก็ขอให้ใส่ timezone ด้วยครับ เพราะเราไม่มีทางรู้เลยว่าบนอุปกรณ์อื่นๆ ที่เราสื่อสารด้วยนั้นตั้งค่า timezone เป็นอย่างไร

JSON / XML ใช้อันไหนดีกว่ากัน?

จริงๆ แล้วก็เทียบกันตรงๆ ไม่ได้ เพราะ XML นั้นค่อนข้างจะ rich กว่า กล่าวคือ XML นั้นมีขนาดใหญ่กว่า JSON เมื่อเก็บข้อมูลที่เท่ากัน แต่ใน XML เราสามารถ attribute ของ element ต่างๆ ใน tag ของ element นั้นได้เลย ในขณะที่ใน JSON ต้องสร้างเป็น nested object

ในเรื่องของความง่ายในการเขียนข้อมูลต้องบอกว่า XML นั้นชนะเมื่อให้มนุษย์เป็นคนเขียน แต่แพ้เมื่อให้คอมพิวเตอร์เขียน เพราะว่าโครงสร้างของ JSON นั้นง่ายต่อการผิดพลาดมาก และยิ่งถ้าจัดเรียงไม่เป็นระเบียบละก็จบครับ

ส่วนในเรื่องการอ่านนั้นผมมองว่า JSON นั้นอ่านง่ายและ clean กว่าในทุกกรณี (เว้นแต่กรณีที่ไม่ well form ซึ่ทำให้โปรแกรมอ่านไม่ได้เลย แต่ใน xml ที่ไม่ well form โปรแกรมอาจจะยังพออ่านได้)

สรุปคือมีข้อดีข้อเสียทั้ง 2 อย่างครับ

References

ข้อมูลและรูปภาพประกอบทั้งหมดจาก json.org

‎day37 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...