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

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

ภาพรวมของ JSON

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

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

JSON แสดงข้อมูลในรูปแบบคู่คีย์และค่า (key-value pairs) ตัวอย่างเช่น โครงสร้าง JSON ด้านล่างนี้:
{
  "名前": "佐藤",
  "年齢": 30,
  "趣味": ["読書", "映画"]
}
ในตัวอย่างนี้ 名前 เป็นสตริง, 年齢 เป็นตัวเลข, และ 趣味 เป็นอาเรย์ เนื่องจากมีโครงสร้างที่เรียบง่ายและอ่านเข้าใจง่าย ทำให้การแลกเปลี่ยนข้อมูลมีประสิทธิภาพสูง

ข้อดีของ JSON

  1. เบาและมีประสิทธิภาพ: เนื่องจากเป็นข้อความปกติ ปริมาณข้อมูลที่ส่งจึงน้อย ช่วยลดภาระของเครือข่าย
  2. เข้ากันได้สูง: รองรับโดยแทบทุกภาษาโปรแกรมและสามารถใช้งานได้บนหลายแพลตฟอร์ม
  3. แปลงข้อมูลได้ง่าย: การอ่านและเขียนข้อมูลทำได้สะดวก โดยเฉพาะอย่างยิ่งในงานสื่อสารผ่าน API
Ad

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)
Ad

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)
 
Ad

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)
Ad
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 ถูกต้อง
Ad

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