Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

แพ็กเกจ JSON encoder และ decoder ใน Python

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
dictobject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull

คลาส 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