1. Khái niệm về JSON

JSON viết tắt của cụm từ “JavaScript Object Notation”  là một kiểu dữ liệu mở trong ngôn ngữ lập trình JavaScript. Kiểu dữ liệu này bao gồm chủ yếu là text, có thể đọc được theo dạng cặp “thuộc tính – giá trị”. Về cấu trúc, JSON mô tả một vật thể bằng cách bọc những vật thể con trong vật thể lớn hơn trong dấu ngoặc nhọn ({ }).

Định dạng JSON sử dụng các cặp key–value để dữ liệu sử dụng. Trong JSON, các key phải là kiểu chuỗi, viết trong cặp nháy kép. Ví dụ dưới đây là một chuỗi JSON cho một đối tượng máy tính:

{
 "type": "laptop",
 "brand": "Acer",
 "operating system": "Windows 11",
 "graphic card": "NVIDIA"
}

2. Xử lý JSON trong Python

Trong Python có một mô-đun tích hợp được gọi là json, mô-đun này có thể được sử dụng để làm việc với dữ liệu JSON. Để sử dụng được mô-đun json cho chương trình, bạn phải có câu lệnh nhập mô-đun như sau:

import math

Khi bạn đã nhập mô-đun json, bạn có thể bắt đầu sử dụng các phương thức và hằng số của mô-đun.

2.1 Chuyển đổi JSON thành Dict bằng phương thức json.loads()

Nếu bạn có một chuỗi JSON, bạn có thể nhập chuỗi JSON này vào Python bằng cách sử dụng phương thức json.loads() – phương thức này sẽ chuyển đổi chuỗi JSON thành kiểu dữ liệu dict với các phần tử trong JSON sẽ là các cặp “key”:”value” tương ứng trong dict.

import json

# Chuoi JSON ban dau:
x = '{ "name":"Nam", "age":20, "city":"Ha Noi"}'

# Chuyen chuoi JSON sang kieu dict trong Python
y = json.loads(x)

# Kiem tra kieu du lieu cua y sau khi chuyen doi sang dict
print(type(y))

# Hien thi y la mot dict trong Python
print(y)

#print(y["name"]
#print(y["age"]
#print(y["city"]

Kết quả:

<class ‘dict’>
{‘name’: ‘Nam’, ‘age’: 20, ‘city’: ‘Ha Noi’}

Sau khi chuỗi JSON được truyền vào phương thức json.loads() sẽ mang kiểu Dict, và ta hoàn toàn có thể sử dụng và thao tác giống với kiểu dữ liệu Dict.

2.2 Chuyển đổi thành chuỗi JSON bằng phương thức json.dumps()

Ngược lại với việc chuyển đổi JSON thành kiểu dữ liệu Dict trong Python thì ta cũng có thể chuyển đổi ngược lại đối với kiểu Dict thành một chuỗi JSON thông qua phương thức json.dumps()

import json

# Khai bao mot dict trong Python
x = {
  "name": "Nam",
  "age": 20,
  "city": "Ha Noi"
}

# Chuyen dict sang chuoi json
y = json.dumps(x)

# Kiem tra kieu du lieu
print(type(y))

# Ket qua la mot chuoi json
print(y)

Kết quả:

<class ‘str’>
{“name”: “Nam”, “age”: 20, “city”: “Ha Noi”}

Ngoài ra, bạn cũng có thể chuyển đổi các kiểu dữ liệu sau từ kiểu dữ liệu của Pyhton sang thành chuỗi JSON.

  • dict
  • list
  • tuple
  • string
  • int
  • float
  • True
  • False
  • None

Ví dụ dưới đây, chuyển đổi các giá trị mang các kiểu dữ liệu dict, list, tuple, string, int, float, True, False, None sang một chuỗi JSON bằng cách sử dụng phương thức json.dumps()

import json

# Chuyen doi cac gia tri thuoc kieu dict, list, tuple, string, int, float, True, False, None sang chuoi json
print(json.dumps({"name": "Nam", "age": 20}))
print(json.dumps(["xe may", "xe dap"]))
print(json.dumps(("xe may", "xe dap")))
print(json.dumps("Laptrinhtudau"))
print(json.dumps(72))
print(json.dumps(35.55))
print(json.dumps(True))
print(json.dumps(False))
print(json.dumps(None))

Kết quả:

{“name”: “Nam”, “age”: 20}
[“xe may”, “xe dap”]
[“xe may”, “xe dap”]
“Laptrinhtudau”
72
35.55
true
false
null

Khi bạn chuyển đổi các kiểu dữ liệu từ Python sang JSON, các đối tượng Python được chuyển đổi thành chuỗi JSON sẽ tương đương với các kiểu dữ liệu có trong Javascript như sau:

Python JSON
dict Object
list Array
tuple Array
str String
int Number
float Number
True true
False false
None null

Ví dụ tiếp theo, chuyển đổi một Dict trong Python bao gồm các kiểu dữ liệu hợp lệ khi chuyển sang chuỗi JSON – các kiểu dữ liệu hợp lệ ở đây được tính là: string, number, object, array, boolean…

import json

# Khai bao dict trong Python
x = {
  "name": "Nam",
  "age": 20,
  "married": False,
  "friends": ("Thanh","Son", "Ha"),
  "pets": None,
  "computer": [
    {"type": "Laptop", "price": 27.5},
    {"type": "Desktop", "price": 24.1}
  ]
}

# Chuyen doi dict x sang chuoi json
y = json.dumps(x)

# Ket qua la chuoi json
print(y)

Kết quả:

{“name”: “Nam”, “age”: 20, “married”: false, “friends”: [“Thanh”, “Son”, “Ha”], “pets”: null, “computer”: [{“type”: “Laptop”, “price”: 27.5}, {“type”: “Desktop”, “price”: 24.1}]}

3. Định dạng chuỗi JSON trong Python

Ở các ví dụ trên, chúng ta đều nhận được kết quả là một chuỗi JSON, tuy nhiên chuỗi JSON này lại nằm cùng trên một dòng. Về trực quan việc JSON được hiển thị cùng trên một dòng rất không dễ đọc, nó làm chuỗi không có thụt lề và ngắt dòng.

Khi sử dụng phương thức json.dumps() để chuyển các kiểu dữ liệu sang JSON ta có thể thêm các tham số để giúp đọc kết quả dễ dàng hơn:

Ví dụ dưới đây, chuyển đổi Dict sang JSON bằng phương thức json.dumps() với tham số indent=4 để định dạng và hiển thị một chuỗi JSON dễ đọc:
import json

# Khai bao dict trong Python
x = {
  "name": "Nam",
  "age": 20,
  "married": False,
  "friends": ("Thanh","Son", "Ha"),
  "pets": None,
  "computer": [
    {"type": "Laptop", "price": 27.5},
    {"type": "Desktop", "price": 24.1}
  ]
}

# Chuyen doi dict x sang chuoi json voi tham so indent = 4
y = json.dumps(x,indent=4)

# Ket qua la chuoi json
print(y)

Kết quả:

{
    "name": "Nam",
    "age": 20,
    "married": false,
    "friends": [
        "Thanh",
        "Son",
        "Ha"
    ],
    "pets": null,
    "computer": [
        {
            "type": "Laptop",
            "price": 27.5
        },
        {
            "type": "Desktop",
            "price": 24.1
        }
    ]
}

Ta có thể sắp xếp các phần tử trong chuỗi JSON trên bằng cách sử dụng tham số sort_keys trong phương thức json.dumps(). Khi đó ta chỉ cần thay đổi câu lệnh

y = json.dumps(x,indent=4)

thay đổi thành câu lệnh:

y = json.dumps(x,indent=4, sort_keys=True)

Kết quả:

{
    "age": 20,
    "computer": [
        {
            "price": 27.5,
            "type": "Laptop"
        },
        {
            "price": 24.1,
            "type": "Desktop"
        }
    ],
    "friends": [
        "Thanh",
        "Son",
        "Ha"
    ],
    "married": false,
    "name": "Nam",
    "pets": null
}