C# ดึงข้อมูล JSON จาก Web API
หากพูดถึง Web API ที่ให้บริการในการดึงข้อมูลบ้างอย่างที่เราต้องการ สมัยนี้ format ข้อมูลที่ได้จากการเรียกใช้งาน Web API ที่นิยมเป็นส่วนใหญ่ก็จะอยู่ในรูปแบบ JSON (JavaScript Object Notation)
ที่มีโครงการข้อมูลที่รองรับความซับซ้อนหลายชั้น ซึ่งในบทความนี้ผมจะลองใช้ C# ในการดึงข้อมูล Web API ที่เป็น JSON แปลงมาเป็น Object Class เพื่อนำมาใช้งาน ซึ่งตัวอย่างนี้จะทำการสร้าง Window Application ดึงข้อมูลจาก typicode.com ที่ให้บริการทดสอบสร้างแบบจำลองการสร้าง web response ต่างๆ ทำให้ข้ามขั้นตอนการสร้าง Web Service ที่จะ response ข้อมูลออกมาเป็น JSON ได้เลยครับ เรามาเริ่มกันเลยดีกว่า

โดยผมทำการสร้าง New Project เป็น Windows Forms Application ที่มีชื่อว่า FetchJSON จากนั้นทำการสร้างปุ่มเพื่อคลิกใช้งาน API ที่เราต้องการดึงข้อมูลแบบ JSON

จากนั้นก็ double click ที่ปุ่มเพื่อเขียนโค้ด Event เมื่อทำการคลิกปุ่มโดยมีจะทำการดึงข้อมูลจาก URL นี้ครับ
http://jsonplaceholder.typicode.com/posts
ซึ่งมีโค้ดดังต่อไปนี้
[sourcecode language=”C#”]
private void btnFetch_Click(object sender, EventArgs e)
{
string URL = “http://jsonplaceholder.typicode.com/posts”;
WebClient wc = new WebClient();
string json = wc.DownloadString(URL);
Console.WriteLine(json);
}
[/sourcecode]
เมื่อลองรันโปรแกรมดูก็จะได้ผลลัพธ์เหมือนกับที่เราเรียก URL ผ่าน Web Browser เลยโดยผลลัพธ์ในโค้ดนั้นจะเก็บในตัวแปร json แล้ว writeline ออกมานั้นเอง แต่การดึงข้อมูลจาก JSON ยังไม่จบต้องมีการแปลงค่าเอาไปใช้ก่อน ซึ่งผมจะทำการแปลงชุดข้อมูลที่เป็น string ให้เป็น object class โดยต่อจากนี้ให้ไปที่ Tool -> NuGet Package Manager -> Manage NuGet Packages for Solution.. เพื่อทำการลง package เกี่ยวกับ JSON
พิมพ์ในช่อง Search ว่า JSON แล้วจะเจอ Json.net ที่มี Id: Newtonsoft.Json ตามรูปจากนั้นกด install ครับ
ยังเหลืออีกอย่างที่ต้องติดตั้งคือ System.Json ถ้าหาก using System.Json; แล้วไม่เจอให้ไปที่ Tool -> NuGet Package Manager ->Package Manager Console แล้วติดตั้ง System.Json โดยใช้คำสั่ง
[sourcecode]
Install-Package System.Json -Version 4.0.20126.16343
[/sourcecode]
ตามภาพด้านบนเลยครับ
เมื่อติดตั้งเสร็จแล้วเราก็จะเริ่มสร้าง class เพื่อที่จะได้สร้าง object มารองรับข้อมูล Json กันนะครับ สังเกตข้อมูลที่ได้จาก URL ข้อมูล 1 ชุด
[sourcecode]
{
“userId”: 1,
“id”: 1,
“title”: “sunt aut facere repellat provident occaecati excepturi optio reprehenderit”,
“body”: “quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto”
}
[/sourcecode]
จะประกอบด้วย userId, id, title, body เพราะฉะนั้น class เลยต้องมี attribute พวกนี้ด้วยแต่ไม่จำเป็นต้องสร้างให้ครบก็ได้นะครับ ใช้แค่ไหนสร้างแค่นั้น ซึ่งผมจะทำการสร้าง Class ที่มีชื่อว่า Post.cs
โดยมีโค้ดดังนี้
[sourcecode language=”C#”]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FetchJSON
{
class Post
{
public int userId;
public int id;
public string title;
public string body;
}
}
[/sourcecode]
จะเห็นว่า attribute class นี้ผมสร้างตามข้อมูล Json หมดและกำหนดให้เป็น public ทุกตัวเพื่อที่เวลาแปลงจะได้แปลงง่ายไม่ติดปัญหาของการ encapsulation ของ object class นั้นเอง
ต่อไปจะเป็นโค้ดเพิ่มเติมตอนกด event ปุ่มนั้นเองมีโค้ดดังนี้ครับ
[sourcecode language=”C#”]
private void btnFetch_Click(object sender, EventArgs e)
{
string URL = “http://jsonplaceholder.typicode.com/posts”;
WebClient wc = new WebClient();
string json = wc.DownloadString(URL);
Console.WriteLine(json);
JsonArray jsonObj = (JsonArray)JsonObject.Load(wc.OpenRead(URL));
List>(jsonObj.ToString());
}
[/sourcecode]
จากโค้ดจะเห็นว่ามีการเพิ่มมา 2 บรรทัดเพื่อทำการแปลง Json เป็น Object Class โดยใช้ method JSONObject.Load โดยส่งค่า Stream ที่ได้จาก wc.OpenRead(URL) นั้นเอง แล้วการใช้คำสั่ง JsonObject.Load ต้องตรวจสอบก่อนว่า Json ที่เราจะดึงข้อมูลนั้นเป็น JsonObject หรือ JsonArray สังเกตดังนี้ครับ
ถ้าอยู่ในเครื่องหมาย [] ก็จะเป็น Json Array และถ้าอยู่ใน {} จะเป็น Json Object ครับผม เพราะฉะนั้นในโค้ดเลยแปลงเป็น JsonArray แล้วหลังจากนั้นทำการ ใช้คำสั่ง JsonConvert.DeserializeObject เป็น List ของ Object Class Post ที่เราสร้างไว้เพราะจากข้อมูลจะสังเกตเห็นว่าใน Json Array มี Json Object หลายๆอันเหลือเกิน เมื่อลอง Debug และรันดูก็จะได้ดังภาพด้านล่างครับ
จะเห็นว่าเราได้ List ที่เก็บ Object Class Post มา 100 จากนั้นจะเอาไปเก็บลง Database หรือทำอะไรต่อก็แล้วแต่เลยครับ ผมขอจบบทความนี้ไว้แค่นี้ก่อนเจอกันใหม่บทความหน้าครับ
Download SourceCode