โมดูล JSON Module ในภาษา Python

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

ในภาษา Python เราสามารถใช้งาน JSON ได้โดยใช้โมดูล json ซึ่งมาตรฐานมาตรฐานกับ Python และสามารถนำ JSON เข้ามาเป็นข้อมูลใน Python ได้และสามารถแปลงกลับไปเป็น JSON อีกครั้งได้อย่างสะดวก

ตัวอย่าง

import json

# ตัวอย่าง Python object
person = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

# แปลง Python object เป็น JSON string และแสดงผล
person_json = json.dumps(person, indent=4)
print(person_json)

# แปลง JSON string เป็น Python object และแสดงผล
person_dict = json.loads(person_json)
print(person_dict)

# แปลง Python object เป็น JSON format และเขียนลงในไฟล์
with open("person.json", "w") as f:
    json.dump(person, f)

# อ่านข้อมูล JSON จากไฟล์และแปลงเป็น Python object
with open("person.json", "r") as f:
    person_from_file = json.load(f)
print(person_from_file)

ผลลัพธ์ที่ได้ คือ

{
    "name": "John",
    "age": 30,
    "city": "New York"
}
{'name': 'John', 'age': 30, 'city': 'New York'}
{'name': 'John', 'age': 30, 'city': 'New York'}

โมดูล json ในภาษา Python มีฟังก์ชันหลายตัวที่ช่วยในการจัดการกับข้อมูล JSON ได้แก่

  1. json.dumps(): แปลง Python object เป็น JSON format (serialize) โดยสามารถกำหนดตัวแปร indent ในการกำหนดจำนวน space ที่ใช้เว้นบรรทัดใน JSON output ได้

  2. json.loads(): แปลง JSON string เป็น Python object (deserialize)

  3. json.dump(): แปลง Python object เป็น JSON format แล้วเขียนลงในไฟล์ โดยระบุตำแหน่งไฟล์ที่ต้องการเขียน

  4. json.load(): อ่านข้อมูล JSON จากไฟล์แล้วแปลงเป็น Python object

  5. json.JSONEncoder ใช้สำหรับการเขียนข้อมูลเป็น JSON ด้วยการ encode object ให้กลายเป็น JSON format ที่ใช้ส่งข้อมูลระหว่างเว็บเซอร์วิส หรือบันทึกข้อมูลลงในไฟล์
  6. json.JSONEncoder เป็นคลาสในโมดูล json ของภาษา Python ที่ใช้สำหรับแปลงข้อมูล Python ให้อยู่ในรูปแบบ JSON โดยสามารถกำหนดค่าการแปลงข้อมูลได้ตามต้องการ

json.dumps()

เป็นฟังก์ชันของโมดูล json ในภาษา Python ที่ใช้สำหรับแปลง Python object ให้อยู่ในรูปของ JSON string โดยฟังก์ชันนี้จะรับ object เข้ามานรูปแบบของ Python data structure แล้วแปลงให้อยู่ในรูปของ JSON string โดยการแปลงจะเป็นตามรูปแบบของ JSON syntax

การใช้งาน json.dumps() มีรูปแบบดังนี้

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

โดยที่:

  • obj: จะระบุข้อมูลที่ต้องการแปลงเป็น JSON string
  • skipkeys (default=False): ถ้าเป็น True จะไม่รองรับ keys ที่ไม่ใช่ string ใน dictionary โดยจะถูกข้ามไปเลย
  • ensure_ascii (default=True): ถ้าเป็น True จะแปลงข้อมูลเป็น Unicode escapes สำหรับ ASCII ที่ไม่พอดี ถ้าเป็น False จะเรียกใช้ Unicode โดยตรง
  • check_circular (default=True): ถ้าเป็น True จะตรวจสอบว่ามีการอ้างอิงเชิงวงกลมใน obj หรือไม่ และถ้ามีจะเกิด ValueError ขึ้น
  • allow_nan (default=True): ถ้าเป็น True จะรองรับการแปลง NaN, Infinity, -Infinity เป็น null ถ้าเป็น False จะเกิด ValueError ขึ้น
  • cls (default=None): ถ้าไม่ระบุ จะใช้ json.JSONEncoder เป็นค่าเริ่มต้น หรือสามารถระบุเป็น subclass ของ json.JSONEncoder ได้ สำหรับการแปลง object ที่ไม่สามารถแปลงเป็น JSON ได้
  • indent (default=None): กำหนดระยะห่างของ indentation (การเว้นวรรค) ใน JSON string ที่สร้างขึ้น ถ้าไม่ได้ระบุจะไม่มีการเว้นวรรค หรือระบุเป็นจำนวนตัวอักษรในแต่ละบรรทัด
  • separators (default=None): กำหนดเครื่องหมายต่าง ๆ ใน JSON string ที่สร้างขึ้น โดยระบุเป็น tuple ของ 2 ตัวอักษร เช่น (',', ':') หรือ (',', ': ') เป็นต้น

โดยฟังก์ชัน json.dumps() มีพารามิเตอร์หลัก 2 ตัว ได้แก่

  • obj (จำเป็น): รับ object เข้ามาในรูปแบบของ Python data structure เช่น dictionary, list, tuple, set เป็นต้น
  • indent (ไม่จำเป็น): ระบุจำนวน space หรือ tab สำหรับการ indent ของ JSON string ซึ่งทำให้อ่านง่ายขึ้น หากไม่ระบุจะไม่มีการ indent

โดยเมื่อใช้งานฟังก์ชัน json.dumps() จะได้ออกมาเป็น JSON string ที่สามารถใช้ส่งออกไปยังอื่น ๆ ได้หรือเก็บลงในไฟล์ที่มีนามสกุล .json เพื่อใช้ในการอ่านหรือนำเข้าข้อมูลใน Python อีกครั้งในภายหลัง หรือสามารถนำไปใช้กับเว็บแอปพลิเคชันที่ต้องการรับ JSON object เข้ามาด้วย API ได้

json.dumps() เป็นฟังก์ชั่นของ JSON ในภาษา Python ที่ใช้สำหรับแปลง Python object เป็น JSON string ในรูปแบบของ string หรือ UTF-8 bytes

โดยมีพารามิเตอร์หลัก 2 ตัว คือ obj ซึ่งเป็น Python object ที่ต้องการแปลงเป็น JSON string และ indent ซึ่งใช้กำหนดค่า indent ในการแสดงผล

ตัวอย่าง การใช้งาน json.dumps() ในการแปลง Python dictionary ให้เป็น JSON string:

import json

person = {"name": "John", "age": 30, "city": "New York"}

person_json = json.dumps(person)

print(person_json)

ผลลัพธ์ที่ได้ คือ

{"name": "John", "age": 30, "city": "New York"}

เราสามารถใช้พารามิเตอร์ indent เพื่อกำหนดการจัด Format ของ JSON string ที่ได้ เช่น

import json

person = {"name": "John", "age": 30, "city": "New York"}

person_json = json.dumps(person, indent=4)

print(person_json)

ผลลัพธ์ที่ได้ คือ

{
    "name": "John",
    "age": 30,
    "city": "New York"
}


json.loads()

เป็นฟังก์ชันในภาษา Python ที่ใช้แปลงข้อความ JSON ที่อยู่ในรูปแบบ string เป็นโครงสร้างข้อมูล Python (Python data structure) อย่างได้เช่นเดียวกันกับ json.load() แต่ต่างกันที่ json.load() รับ input เป็น file object แต่ json.loads() รับ input เป็น string หรือ JSON text โดยที่ต้องไม่มี syntax error

โดยมีรูปแบบการใช้งานดังนี้

json.loads(s, *, cls=None, object_hook=None, parse_float=None,
    parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

โดยที่:

  • s: คือ string หรือ JSON text ที่จะแปลงเป็นโครงสร้างข้อมูล Python
  • cls: คือคลาสที่สืบทอดจาก json.JSONDecoder ซึ่งจะถูกใช้เมื่อต้องการปรับเปลี่ยนโครงสร้างการแปลงข้อมูล
  • object_hook: คือฟังก์ชันที่จะถูกเรียกเมื่อโครงสร้าง JSON object ถูกแปลงเป็นโครงสร้างข้อมูล Python dictionary
  • parse_float: คือฟังก์ชันที่จะถูกเรียกเมื่อต้องการแปลงค่า float
  • parse_int: คือฟังก์ชันที่จะถูกเรียกเมื่อต้องการแปลงค่า integer
  • parse_constant: คือฟังก์ชันที่จะถูกเรียกเมื่อต้องการแปลงค่า JSON constant (true, false, null)
  • object_pairs_hook: คือฟังก์ชันที่จะถูกเรียกเมื่อโครงสร้าง JSON object ถูกแปลงเป็นโครงสร้างข้อมูล Python dictionary โดยใช้วิธีการแปลง pairs

ตัวอย่าง การใช้งาน json.loads() 

import json

# ตัวอย่าง JSON string
json_string = '{"name": "Alice", "age": 30}'

# แปลง JSON string เป็น Python dictionary
data = json.loads(json_string)

# แสดงผล
print(data)

ผลลัพธ์ที่ได้ คือ

{'name': 'Alice', 'age': 30}


json.dump()

เป็นฟังก์ชันในโมดูล JSON ของ Python ที่ใช้สำหรับเขียนข้อมูล JSON ลงในไฟล์ โดยรับพารามิเตอร์ที่ต้องการเขียน (object) และไฟล์ที่ต้องการเขียนลง (fp) ซึ่งสามารถเป็นไฟล์เปิด (file-like object) หรือชื่อไฟล์ (file name) ของไฟล์ที่ต้องการเขียน การใช้งานคล้ายกับ json.dumps() แต่ค่าที่ได้จะถูกเขียนลงในไฟล์แทนที่จะรีเทิร์นเป็นข้อมูลชนิด string

json.dump() เป็นฟังก์ชันที่ใช้เพื่อเขียนข้อมูลจาก Python object ลงในไฟล์ที่มีรูปแบบ JSON ในภาษา Python

โดยฟังก์ชันนี้จะรับอาร์กิวเมนต์สองตัว คือ ข้อมูลที่ต้องการเขียนลงในไฟล์และไฟล์ที่ต้องการเขียนลงไป ดังนั้นเราสามารถนำ Python object มาแปลงเป็น JSON string ด้วย json.dumps() แล้วเขียนลงในไฟล์ได้ด้วย json.dump()

รูปแบบการใช้งาน json.dump() คล้ายกับ json.dumps() แต่จะมีพารามิเตอร์เพิ่มอีกตัวที่ต้องระบุได้แก่ fp (file pointer) ซึ่งจะเป็นตัวแปรชนิด file object ที่เปิดไฟล์ JSON ไว้ เพื่อที่จะเขียนไฟล์ JSON ไปยังไฟล์นั้น

รูปแบบการใช้งาน json.dump() มีดังนี้

import json

with open('file.json', 'w') as f:
    json.dump(data, f)

โดยที่ file.json คือชื่อไฟล์ JSON ที่จะเขียน และ data คือข้อมูลที่จะถูกเขียนลงในไฟล์ JSON ที่เป็นไฟล์นั้น

ตัวอย่าง การใช้งาน json.dump():

import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open('data.json', 'w') as f:
    json.dump(data, f)

จากตัวอย่าง เมื่อทำการรันโค้ดนี้ โปรแกรมจะสร้างไฟล์ data.json และเขียนข้อมูล JSON ที่อยู่ในตัวแปร data ลงไปในไฟล์นั้น

json.load()

เป็นฟังก์ชันใน Python ที่ใช้สำหรับอ่านข้อมูลจากไฟล์ JSON และแปลงเป็น Python objects ในรูปแบบต่างๆ เช่น dictionary, list, string, integer, boolean, หรือ None ซึ่งใช้คู่กับฟังก์ชัน open() ในการเปิดไฟล์ JSON ดังนั้นจึงต้องระบุ path ของไฟล์ด้วย

รูปแบบการใช้งาน json.load() จะเป็นดังนี้

import json

with open('path/to/file.json') as f:
    data = json.load(f)

โดยใช้คำสั่ง with open() เพื่อเปิดไฟล์ JSON ในโหมดอ่าน ('r') และกำหนดตัวแปร f ในการอ้างอิงไฟล์ จากนั้นใช้ json.load(f) เพื่ออ่านข้อมูลจากไฟล์และแปลงเป็น Python objects ที่เก็บไว้ในตัวแปร data โดยใช้ with statement จะช่วยในการปิดไฟล์ JSON อัตโนมัติ หลังจากการอ่านข้อมูลเสร็จสิ้น ทำให้สามารถรักษาความปลอดภัยของข้อมูลและลดโอกาสในการเกิดข้อผิดพลาดในการเปิดไฟล์ JSON ได้

ฟังก์ชัน json.load() ใช้สำหรับแปลงข้อมูลในรูปแบบ JSON ที่อยู่ในไฟล์ไปเป็นข้อมูลในรูปแบบ Python object ซึ่งเป็นการอ่านข้อมูลจากไฟล์ JSON แล้วแปลงเป็น Python object เพื่อให้สามารถใช้งานได้ในโปรแกรม Python ต่อไปได้

ตัวอย่าง การใช้งาน json.load():

สมมติว่ามีไฟล์ชื่อ data.json ที่มีโครงสร้างข้อมูลดังนี้

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

สามารถเขียนโค้ด จะอ่านข้อมูลจากไฟล์ data.json ดังนี้

import json

# อ่านข้อมูลจากไฟล์
with open('data.json', 'r') as f:
    data = json.load(f)

# แสดงผลลัพธ์
print(data)

ผลลัพธ์ที่แสดงออกมาจะเป็นข้อมูลในรูปแบบ Python object ดังนี้

{'name': 'John', 'age': 30, 'city': 'New York'}


json.JSONEncoder

เป็นคลาสในโมดูล json ของภาษา Python ที่ใช้สำหรับการเขียนข้อมูลเป็น JSON ด้วยการ encode object ให้กลายเป็น JSON format ที่ใช้ส่งข้อมูลระหว่างเว็บเซอร์วิส หรือบันทึกข้อมูลลงในไฟล์ โดยมีเมทอดหลักคือ encode() ซึ่งจะแปลงข้อมูลจาก object ให้เป็น JSON string โดยสามารถ customize การแปลงด้วยการสร้างคลาสสืบทอดจาก json.JSONEncoder และ override เมทอด default() ที่จะเรียกใช้ต่อเมื่อพบกับ object ที่ไม่รองรับในการแปลงเป็น JSON

json.JSONEncoder เป็นคลาสในโมดูล json ของภาษา Python ที่ใช้สำหรับแปลงข้อมูล Python ให้อยู่ในรูปแบบ JSON โดยสามารถกำหนดค่าการแปลงข้อมูลได้ตามต้องการ โดยคลาส JSONEncoder จะมีเมธอด encode() ที่ใช้สำหรับแปลงข้อมูล Python เป็น JSON string ตามรูปแบบที่กำหนดในคลาส JSONEncoder และสามารถใช้งานได้ทั้งกับ object ใน Python ที่มีรูปแบบซับซ้อน เช่น list, tuple, dict และอื่นๆ

โดยค่า default ของ JSONEncoder คือการแปลง object ใน Python ตามรูปแบบ JSON แต่สามารถกำหนดเปลี่ยนแปลงได้ตามต้องการ โดยการสืบทอดคลาส JSONEncoder แล้วแก้ไขเมธอด default() หรือ encode() ของคลาสเหล่านั้น

โดยสามารถใช้ json.dumps() เพื่อเขียนข้อมูลเป็น JSON โดยที่ไม่ต้องกำหนดคลาส Encoder ด้วย ซึ่งฟังก์ชันนี้จะสามารถ encode ได้หลาย type ได้รวมถึง dict, list, tuple, string, int, float, bool, และ None ด้วย

json.JSONEncoder เป็นคลาสที่ใช้สำหรับสร้าง JSON object จาก Python object โดยเฉพาะอย่างยิ่งใช้สำหรับแปลง Python object ที่ไม่ใช่ dictionary หรือ list เป็น JSON string

โดยปกติแล้ว json.dumps() จะใช้ json.JSONEncoder แบบ default อยู่แล้ว ดังนั้นสามารถใช้งาน json.JSONEncoder โดยการสร้าง subclass แล้ว override method default() ของ json.JSONEncoder ให้เป็นรูปแบบที่เราต้องการ

ตัวอย่าง การใช้ json.JSONEncoder:

import json

class MyEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, set):
            return list(o)
        return json.JSONEncoder.default(self, o)

data = {'name': 'John', 'age': 30, 'city': 'New York', 'interests': {'music', 'books', 'sports'}}
json_data = json.dumps(data, cls=MyEncoder)

print(json_data)
# output: {"name": "John", "age": 30, "city": "New York", "interests": ["books", "music", "sports"]}

จากตัวอย่างข้างต้น เราสร้าง MyEncoder สืบทอดจาก json.JSONEncoder และ override default() เพื่อเปลี่ยน set ให้กลายเป็น list ใน JSON และกำหนดคลาส Encoder ที่เราสร้างเองให้กับ json.dumps() ซึ่งผลลัพธ์ของการ encode ข้อมูลจะได้ JSON string ที่แปลง set ให้กลายเป็น list ด้วย

json.JSONDecoder

เป็นคลาสในโมดูล json ในภาษา Python ซึ่งใช้สำหรับแปลงข้อมูลจาก JSON ให้กลายเป็น Python objects (ตัวแปรชนิดต่าง ๆ) ได้ โดยสามารถใช้งานได้ด้วยเมธอด decode() ซึ่งรับข้อมูล JSON ในรูปแบบของ string และส่งคืน Python object ตามข้อมูล JSON นั้น ๆ

json.JSONDecoder เป็นคลาสที่ใช้สำหรับแปลง JSON string เป็น Python object โดยมีเมธอดหลักคือ decode() ซึ่งใช้แปลง JSON string ให้เป็น Python object ในรูปแบบต่าง ๆ ตามได้แก่ dictionary, list, tuple, string, number, boolean, และ None ตามลำดับ

รูปแบบการใช้งาน json.JSONDecoder มีดังนี้

import json

# สร้าง JSONDecoder object
decoder = json.JSONDecoder()

# แปลง JSON string เป็น Python object
python_obj = decoder.decode(json_string)

โดยที่ json_string คือ JSON string ที่ต้องการแปลง ส่วน python_obj จะเป็น Python object ที่ได้จากการแปลง JSON string

ตัวอย่าง การใช้งาน json.JSONDecoder:

import json

# JSON data
json_string = '{"name": "John", "age": 30, "city": "New York"}'

# Create a JSON decoder object
decoder = json.JSONDecoder()

# Decode JSON data into Python objects
data = decoder.decode(json_string)

# Print the decoded data
print(data)

ผลลัพธ์ที่ได้ คือ

{'name': 'John', 'age': 30, 'city': 'New York'}

จากตัวอย่าง การสร้าง json.JSONDecoder object ด้วย json.JSONDecoder() และเรียกใช้เมธอด decode() เพื่อแปลงข้อมูล JSON string ในตัวอย่างคือ json_string ให้กลายเป็น Python object (dictionary) ที่ได้กำหนดไว้ในตัวแปร data