1. JSON คืออะไร? (ความรู้พื้นฐาน)
ภาพรวมของ JSON
JSON (JavaScript Object Notation) เป็นรูปแบบข้อมูลที่ถูกใช้อย่างบ่อยครั้งในการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ มีความเบา อ่านง่าย และมีโครงสร้างที่เรียบง่าย ทำให้ถูกนำมาใช้กันอย่างกว้างขวางทั้งในเว็บแอปพลิเคชันและแอปพลิเคชันบนมือถือ JSON เป็นรูปแบบข้อความ (text-based) ที่สามารถใช้งานได้ง่ายในทุกภาษาโปรแกรม จึงมีความยืดหยุ่นสูงมาก
โครงสร้างพื้นฐานของ JSON
JSON แสดงข้อมูลในรูปแบบคู่คีย์และค่า (key-value pairs) ตัวอย่างเช่น โครงสร้าง JSON ด้านล่างนี้:
{
"名前": "佐藤",
"年齢": 30,
"趣味": ["読書", "映画"]
}
ในตัวอย่างนี้ 名前
เป็นสตริง, 年齢
เป็นตัวเลข, และ 趣味
เป็นอาเรย์ เนื่องจากมีโครงสร้างที่เรียบง่ายและอ่านเข้าใจง่าย ทำให้การแลกเปลี่ยนข้อมูลมีประสิทธิภาพสูง
ข้อดีของ JSON
- เบาและมีประสิทธิภาพ: เนื่องจากเป็นข้อความปกติ ปริมาณข้อมูลที่ส่งจึงน้อย ช่วยลดภาระของเครือข่าย
- เข้ากันได้สูง: รองรับโดยแทบทุกภาษาโปรแกรมและสามารถใช้งานได้บนหลายแพลตฟอร์ม
- แปลงข้อมูลได้ง่าย: การอ่านและเขียนข้อมูลทำได้สะดวก โดยเฉพาะอย่างยิ่งในงานสื่อสารผ่าน API
2. การใช้งาน JSON ใน Python (พื้นฐาน)
โมดูล json
ของ Python
ใน Python สามารถใช้โมดูล json
เพื่ออ่านและเขียนข้อมูล JSON ได้อย่างง่ายดาย ตัวอย่างเช่น การแปลง JSON เป็นพจนานุกรมของ Python สามารถทำได้ด้วยฟังก์ชัน json.loads()
import json
json_data = '{"名前": "佐藤", "年齢": 30}'
python_obj = json.loads(json_data)
print(python_obj) # {'名前': '佐藤', '年齢': 30}
ในทางกลับกัน หากต้องการแปลงออบเจ็กต์ของ Python เป็น JSON สามารถใช้ json.dumps()
python_obj = {"名前": "佐藤", "年齢": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)
print(json_data) # {"名前": "佐藤", "年齢": 30}
การอ่านและเขียนไฟล์
ยังสามารถอ่านข้อมูล JSON จากไฟล์หรือเขียนข้อมูล JSON ลงไฟล์ได้เช่นกัน
# อ่านจากไฟล์
with open('data.json', 'r') as f:
data = json.load(f)
# เขียนลงไฟล์
with open('data.json', 'w') as f:
json.dump(python_obj, f, ensure_ascii=False)
3. การสื่อสาร JSON ใน Python (ภาคปฏิบัติ)
การใช้งานโมดูล requests สำหรับ API
ด้วยโมดูล requests
สามารถส่งและรับข้อมูล JSON ผ่าน API ได้ง่าย ตัวอย่างการส่ง JSON ด้วยคำสั่ง POST:
การส่ง JSON ด้วย POST request
import requests
url = 'https://example.com/api'
data = {'名前': '佐藤', '年齢': 30}
response = requests.post(url, json=data)
json_response = response.json()
print(json_response)
การรับ JSON ด้วย GET request
การดึงข้อมูล JSON ผ่าน GET request จาก API:
response = requests.get('https://example.com/api/user/1')
data = response.json()
print(data)

4. การจัดการข้อผิดพลาดและแนวทางปฏิบัติที่ดีที่สุด
การจัดการข้อผิดพลาดในการสื่อสาร API
หากเกิดข้อผิดพลาดระหว่างการสื่อสารกับ API การจัดการข้อผิดพลาดอย่างเหมาะสมถือว่าสำคัญ ตัวอย่างด้านล่างแสดงการจัดการข้อยกเว้น เช่น ข้อผิดพลาดของเครือข่ายหรือการหมดเวลา:
try:
response = requests.post(url, json=data)
response.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("OOps: Something Else", err)
การทำงานแบบ Retry
เมื่อเครือข่ายไม่เสถียร ควรมีการ retry เพื่อความมั่นคง โดยใน requests
สามารถใช้คลาส Retry
เพื่อตั้งค่า retry ได้ง่าย:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
response = session.get(url)
5. การตรวจสอบความถูกต้องของ JSON
การตรวจสอบด้วย jsonschema
เพื่อยืนยันว่า JSON ที่ได้รับจาก API มีโครงสร้างตรงตามที่คาด สามารถใช้ไลบรารี jsonschema
ตรวจสอบได้:
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"名前": {"type": "string"},
"年齢": {"type": "number"}
},
"required": ["名前", "年齢"]
}
json_data = {"名前": "佐藤", "年齢": 30}
try:
validate(instance=json_data, schema=schema)
print("JSON is valid")
except ValidationError as e:
print("Validation Error:", e)
รองรับทั้งสคีมาที่ซับซ้อนและออบเจ็กต์แบบซ้อนกัน เพื่อให้มั่นใจได้ว่าข้อมูลจาก API ถูกต้อง
6. แนวทางปฏิบัติด้านความปลอดภัย
การจัดการ API Key
ไม่ควรเขียน API Key ไว้ในซอร์สโค้ดโดยตรง ควรใช้ environment variables เพื่อความปลอดภัย:
import os
api_key = os.getenv('API_KEY')
การทำ Data Sanitization
ก่อนส่งข้อมูลที่ผู้ใช้ป้อนเข้ามายังเซิร์ฟเวอร์ ควรทำการ sanitize เพื่อลดความเสี่ยงจาก SQL Injection หรือ Cross-Site Scripting (XSS)
from html import escape
safe_data = escape(user_input)