การใช้งาน JSON และ Python: คู่มือพื้นฐานและตัวอย่างโค้ด

1. JSON คืออะไร? (ความรู้พื้นฐาน)

ภาพรวมของ JSON

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

โครงสร้างพื้นฐานของ JSON

JSON แสดงข้อมูลในรูปแบบคู่คีย์และค่า (key-value pairs) ตัวอย่างเช่น โครงสร้าง JSON ด้านล่างนี้:

{
  "名前": "佐藤",
  "年齢": 30,
  "趣味": ["読書", "映画"]
}

ในตัวอย่างนี้ 名前 เป็นสตริง, 年齢 เป็นตัวเลข, และ 趣味 เป็นอาเรย์ เนื่องจากมีโครงสร้างที่เรียบง่ายและอ่านเข้าใจง่าย ทำให้การแลกเปลี่ยนข้อมูลมีประสิทธิภาพสูง

ข้อดีของ JSON

  1. เบาและมีประสิทธิภาพ: เนื่องจากเป็นข้อความปกติ ปริมาณข้อมูลที่ส่งจึงน้อย ช่วยลดภาระของเครือข่าย
  2. เข้ากันได้สูง: รองรับโดยแทบทุกภาษาโปรแกรมและสามารถใช้งานได้บนหลายแพลตฟอร์ม
  3. แปลงข้อมูลได้ง่าย: การอ่านและเขียนข้อมูลทำได้สะดวก โดยเฉพาะอย่างยิ่งในงานสื่อสารผ่าน 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)
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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)
侍エンジニア塾