2.28. JSON¶
JSON (JavaScript Object Notation) เป็นรูปแบบข้อความที่กระชับและอ่านได้สำหรับข้อมูลที่มีโครงสร้าง โดยกำหนดหกประเภท ได้แก่ string, number, boolean, null, array, และ object ซึ่งแต่ละอันแมปโดยตรงกับค่า Python ดังนั้นการแปลงระหว่าง Python และ JSON คือการเรียกฟังก์ชันเดียวในทั้งสองทิศทาง
JSON คือภาษากลางของ config files และ web APIs ใช้มันเมื่อต้องการบันทึกชุดการตั้งค่าขนาดเล็กลงดิสก์ในรูปแบบที่อ่านได้ด้วยตาเปล่า หรือเพื่อแลกเปลี่ยนข้อมูลที่มีโครงสร้างกับโปรแกรมอื่น
ฟังก์ชันสองตัวครอบคลุมความต้องการส่วนใหญ่:
json.dumps()-- dump string: แปลงค่า Python เป็น JSON stringjson.loads()-- load string: แยกวิเคราะห์ JSON string กลับเป็น Python
คู่ json.dump / json.load (ไม่มี s) ทำงานเหมือนกันแต่รับ file object โดยตรง
2.28.1. การเข้ารหัส (dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
Output:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
การแมปคือ:
สิ่งอื่นนอกจากนั้น (custom class, บัฟเฟอร์ bytes, set) จะ raise TypeError แปลงค่าก่อน
Note
json.dumps() ของ CPython รองรับอาร์กิวเมนต์ indent สำหรับ output ที่จัดรูปแบบสวย แต่ของ MicroPython ไม่รองรับ ปุ่มปรับการจัดรูปแบบเดียวคือ separators ซึ่งควบคุมการเว้นวรรค ส่ง (',', ':') สำหรับรูปแบบที่กระชับที่สุด Output หลายบรรทัดแบบเยื้องต้องสร้างด้วยมือหากจำเป็น
2.28.2. การถอดรหัส (loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
Output:
OpenMV 320
JSON objects กลายเป็น dict arrays กลายเป็น list และส่วนที่เหลือแมปกลับเป็นเทียบเท่า Python JSON ที่ไม่ถูกต้องจะ raise ValueError
2.28.3. การอ่านและเขียนไฟล์¶
คู่แบบ file-based ทำงานได้ดีกับ with:
import json
with open("config.json") as f:
config = json.load(f)
config["width"] = 640
with open("config.json", "w") as f:
json.dump(config, f)
จัดการ JSON file เป็นระเบียนสมบูรณ์ อ่านเข้ามา แก้ไขค่า Python แล้วเขียนกลับ การพยายามแก้ไข JSON ใน place ภายในไฟล์มักสร้าง bug มากกว่าที่ประหยัดได้