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 string

  • json.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 มากกว่าที่ประหยัดได้