JSON ย่อมาจาก JavaScript Object Notation เป็นรูปแบบแลกเปลี่ยนข้อมูลที่เบา الوزن คล้ายกับ pickle แต่ pickle เป็นการ serialize เฉพาะ Python ส่วน JSON ถูกนำไปใช้ในหลายภาษา โมดูล json ในไลบรารีมาตรฐานของ Python ให้ฟังก์ชัน serialization ของออบเจ็กต์ที่คล้ายกับโมดูล pickle และ marshal
เช่นเดียวกับโมดูล pickle โมดูล json ก็มีฟังก์ชัน dumps() และ loads() สำหรับ serialize ออบเจ็กต์ Python เป็นสตริง JSON และ dump() และ load() สำหรับเขียน/อ่านออบเจ็กต์ที่ serialize แล้วจาก/ไปไฟล์
ฟังก์ชัน dumps()
ฟังก์ชันนี้แปลงออบเจ็กต์เป็นรูปแบบ JSON
ฟังก์ชัน loads()
ฟังก์ชันนี้แปลงสตริง JSON กลับเป็นออบเจ็กต์ Python
ตัวอย่างต่อไปนี้สาธิตการใช้งานพื้นฐาน:
>>> import json
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> s = json.dumps(data)
>>> s
'["Rakesh", {"marks": [50, 60, 70]}]'
>>> json.loads(s)
['Rakesh', {'marks': [50, 60, 70]}]
ฟังก์ชัน dumps() รับอาร์กิวเมนต์เพิ่มเติม sort_keys ค่าเริ่มต้นเป็น False หากตั้งเป็น True คีย์ของ dictionary จะปรากฏในลำดับที่จัดเรียงแล้วในสตริง JSON
>>> data = {"marks": 50, "age": 20, "rank": 5}
>>> s = json.dumps(data, sort_keys=True)
>>> s
'{"age": 20, "marks": 50, "rank": 5}'
>>> json.loads(s)
{'age': 20, 'marks': 50, 'rank': 5}
ฟังก์ชัน dumps() มีพารามิเตอร์เพิ่มเติมอีกคือ indent รับค่าตัวเลข กำหนดความยาวของแต่ละส่วนในการแสดงผล JSON ที่จัดรูปแบบ คล้ายกับ output ของ pprint
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> s = json.dumps(data, indent=2)
>>> print(s)
[
"Rakesh",
{
"marks": [
50,
60,
70
]
}
]
โมดูล json ยังมี API แบบเชิงออบเจ็กต์ที่สอดคล้องกับฟังก์ชันข้างต้น มีสองคลาสคือ JSONEncoder และ JSONDecoder
คลาส JSONEncoder
ออบเจ็กต์ของคลาสนี้เป็น encoder สำหรับโครงสร้างข้อมูล Python แต่ละชนิดข้อมูล Python จะถูกแปลงเป็นชนิด JSON ที่สอดคล้องกัน ตามตารางด้านล่าง:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float, int- & float-derived Enums | number |
| True | true |
| False | false |
| None | null |
คลาส JSONEncoder ถูกสร้างด้วยคอนสตรัคเตอร์ JSONEncoder() เมธอดสำคัญที่นิยามใน encoder class:
encode() − serialize ออบเจ็กต์ Python เป็นรูปแบบ JSON
iterencode() − เข้ารหัสออบเจ็กต์และคืนค่า iterator ที่ให้รูปแบบที่เข้ารหัสของแต่ละรายการในออบเจ็กต์
indent − กำหนดระดับ indentation ของสตริงที่เข้ารหัส
sort_keys − เป็น true หรือ false เพื่อให้คีย์ปรากฏในลำดับจัดเรียงหรือไม่
check_circular − หากเป็น True จะตรวจสอบการอ้างอิงแบบวนซ้ำในออบเจ็กต์ชนิด container
ตัวอย่างเข้ารหัสออบเจ็กต์ลิสต์ Python:
>>> e = json.JSONEncoder()
>>> e.encode(data)
'["Rakesh", {"marks": [50, 60, 70]}]'
ใช้เมธอด iterencode() แต่ละส่วนของสตริงที่เข้ารหัสจะแสดงดังนี้:
>>> for obj in e.iterencode(data):
... print(obj)
[
"Rakesh"
{
"marks"
:
[
50
, 60
, 70
]
}
]
คลาส JSONDecoder
ออบเจ็กต์ของคลาสนี้ช่วยถอดรหัสสตริง JSON กลับเป็นโครงสร้างข้อมูล Python เมธอดหลักคือ decode() ตัวอย่างโค้ดต่อไปนี้ดึงออบเจ็กต์ลิสต์ Python จากสตริงที่เข้ารหัสในขั้นตอนก่อนหน้า:
>>> d = json.JSONDecoder()
>>> d.decode(s)
['Rakesh', {'marks': [50, 60, 70]}]
JSON กับไฟล์/สตรีม
โมดูล json นิยามฟังก์ชัน load() และ dump() เพื่อเขียนข้อมูล JSON ไปยังออบเจ็กต์คล้ายไฟล์ ซึ่งอาจเป็นไฟล์ดิสก์หรือไบนารีสตรีม และอ่านข้อมูลกลับจากพวกมัน
ฟังก์ชัน dump()
ฟังก์ชันนี้เข้ารหัสข้อมูลออบเจ็กต์ Python ในรูปแบบ JSON และเขียนลงไฟล์ ไฟล์ต้องมีสิทธิ์เขียน
>>> data = ['Rakesh', {'marks': (50, 60, 70)}]
>>> fp = open('json.txt', 'w')
>>> json.dump(data, fp)
>>> fp.close()
โค้ดนี้จะสร้าง 'json.txt' ในไดเรกทอรีปัจจุบัน เนื้อหาจะเป็นดังนี้:
["Rakesh", {"marks": [50, 60, 70]}]
ฟังก์ชัน load()
ฟังก์ชันนี้โหลดข้อมูล JSON จากไฟล์และสร้างออบเจ็กต์ Python จากมัน ไฟล์ต้องเปิดด้วยสิทธิ์อ่าน
>>> fp = open('json.txt', 'r')
>>> ret = json.load(fp)
>>> ret
['Rakesh', {'marks': [50, 60, 70]}]
>>> fp.close()
บทความนี้ครอบคลุมฟังก์ชันสำคัญในโมดูล json