[VB.NET] การแปลงข้อมูล JSON ด้วย DataContractJsonSerializer

วันนี้นั่งหาข้อมูลไปเรื่อย อยากรู้ว่า JSON (JavaScript Object Notation) ที่เป็นรูปแบบการเก็บข้อมูลชนิดนึงที่ได้รับความนิยม จะสามารถนำไปใช้บน Microsoft Visual Studio ได้หรือไม่

Visusl Studio love JSON

ซึ่ง JSON นั้น รูปแบบการเก็บข้อมูล เช่นเดียวกับ XML ซึ่งภาษาโปรแกรมต่าง ๆ มักจะมีตัว Parser สำหรับแปลงข้อมูล JSON ให้อยู่ในรูปแบบตัวแปรของภาษานั้น ๆ

แต่กับ .NET Framework นั้น ทาง Microsoft ไม่ได้ทำ Parser ไว้ให้ Confused

ก็ลองหาข้อมูลต่อไปเรื่อย ๆ และแล้วก็ได้เจอกับ Class DataContractJsonSerializer ซึ่งถูกเพิ่มเข้ามาบน .NET Framework version 3.5 นั่นแปลว่า ต้องใช้ Visual Studio 2008 ขึ้นไปนั่นเอง

ด้วยความอยากรู้อยากเห็น ก็เลยลองเขียนคำสั่งใช้งานดู ซึ่งก็ค่อนข้างยุ่งยาก และเข้าใจยากพอสมควร ลองมาดูกันว่า เราจะจัดการข้อมูล JSON บน Visual Basic อย่างไร และครอบคลุมชนิดข้อมูลที่ JSON รองรับทั้งหมดหรือไม่

 

List of contents

 

Add Reference

สำหรับ Class DataContractJsonSerializer บน .NET Framework ถูกบรรจุอยู่ใน Assembly System.ServiceModel.Web (หรือใน System.ServiceModel.Web.dll) เราจึงจำเป็นต้อง Add Reference เข้ามาใน Project เราก่อน

Add Reference menu
Add Reference menu

ทำการ Add Reference ทั้งหมด 2 ตัว ตามรูป

Add Reference assembly
Add Reference assembly

เท่านี้ Project เรา ก็สามารถใช้งาน Class DataContractJsonSerializer ได้แล้ว

 

JSON data type

ก่อนจะทำการแปลงข้อมูลในรูปแบบ JSON นั้น เรามาดูกันก่อนว่า JSON นั้น สามารถเก็บข้อมูลชนิดใดได้บ้าง

ชนิดข้อมูลบน JSON
ชนิดข้อมูลบน JSON

ขอยืมรูปมาจาก http://json.org/

จากรูป เป็นชนิดข้อมูลทั้งหมด ที่ JSON สามารถเก็บได้ เมื่อเทียบกับบน VB นั้น ก็คือ String, Integer, Object, Array, Boolean และ Nothing นั่นเอง

ผมจึงได้ Make ข้อมูลขึ้นมา ให้ครอบคลุมทุกชนิดข้อมูล ในการทดสอบ ดังนี้

 

VB.NET Parse JSON to Object

การแปลงข้อมูลจาก JSON ไปเป็น Object จำเป็นต้องทำ Data Class ขึ้นมารองรับ โดยต้องมีรูปแบบตรงกับข้อมูล JSON ที่จะแปลงมา จากตัวอย่างข้อมูลด้านบน จึงต้องสร้าง Class ขึ้นมา ดังนี้

กรณีสร้าง Data Class เป็น Inner Class และกำหนด Accessibility เป็น Private หรือ Friend จำเป็นต้องกำหนด Attribute ที่บรรทัดแรก ว่าเป็นแบบ Serializable ให้ Class ด้วย แต่หาก Accessibility เป็น Public สามารถใช้ได้เลยโดยไม่ต้องกำหนด Attribute Serializable

เมื่อ Data Class พร้อมแล้ว มาลุย Code กันเลย

  • บรรทัดที่ 1 – ประกาศตัวแปรชนิด String ซึ่งเก็บข้อมูลในรูปแบบ JSON ตามที่ได้ Make ไว้ทดสอบ
  • บรรทัดที่ 2 – ทำการแปลง String เป็นชนิด Byte Array ก่อน
  • บรรทัดที่ 3 – ทำการแปลง Byte Array เป็นชนิด MemoryStream
  • บรรทัดที่ 5 – นำ Class DataContractJsonSerializer มาใช้ โดยระบุ Type ของข้อมูล เป็นชนิด Class TestData
  • บรรทัดที่ 6 – ใช้ DataContractJsonSerializer อ่านข้อมูลจาก MemoryStream ออกมา เป็น Object
  • บรรทัดที่ 7 – ทำการแปลงข้อมูล Object เป็นชนิด Class TestData

เมื่อลอง Run ทดสอบดู ได้ผลดังนี้

Parse JSON to Object
Parse JSON to Object

จะเห็นได้ว่า เราสามารถแปลงข้อมูล JSON เป็น Object ได้แล้ว

 

VB.NET Parse Object to JSON

ทีนี้มาลองทำย้อนกลับกันดูบ้าง

  • บรรทัดที่ 1 – ประกาศตัวแปรชนิด TestData แล้วกำหนดค่าให้ โดยนำเอาผลลัพธ์จากตัวอย่างที่แล้วมาใช้
  • บรรทัดที่ 2 – ประกาศตัวแปรชนิด MemoryStream โดยไม่กำหนด Parameter ใด ๆ
  • บรรทัดที่ 4 – นำ Class DataContractJsonSerializer มาใช้ โดยระบุ Type ของข้อมูล เป็นชนิด Class TestData
  • บรรทัดที่ 5 – ใช้ DataContractJsonSerializer เขียนข้อมูลจาก Object ไปลง MemoryStream
  • บรรทัดที่ 6 – ทำการแปลง MemoryStream เป็น Byte Array
  • บรรทัดที่ 7 – ทำการแปลง Byte Array เป็น String ก็จะได้ข้อมูลที่อยู่ในรูปแบบ JSON แล้ว

เมื่อลอง Run ทดสอบดู ได้ผลดังนี้

Parse Object to JSON
Parse Object to JSON

ซึ่งจะได้ผลลัพธ์กลับไปเป็น JSON เริ่มต้นทุกประกาศ

ทดสอบโดยเขียนคำสั่ง strOutput.Equals(strInput) ได้ผลลัพธ์เป็น True ตามรูป

แต่หากใครลองแล้วไม่ได้ True ก็ไม่ต้องแปลกใจ เพราะ Key หรือชื่อตัวแปร เมื่อทำการแปลงจาก Object เป็น JSON นั้น จะมีการเรียงลำดับใหม่ ซึ่งในตัวอย่าง ได้ตั้งชื่อเป็น var1, var2, …, var5 มันก็เลยเรียงลำดับเหมือนเดิมทุกประการ

เท่านี้เราก็สามารถจัดการข้อมูล JSON บน VB.NET ได้แล้ว

ว่าแล้วก็… ไปทำ Class Library JSONParser มาแจก ดีไม๊!?

Leave a Reply

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.