25.Python JSON

JSON là gì?

JSON là một định dạng chuẩn để trao đổi dữ liệu, được lấy cảm hứng từ JavaScript. Về cơ bản, JSON ở dạng chuỗi hoặc văn bản. JSON là viết tắt của Java Script Object Notation.

Cú pháp của JSON: JSON được viết dưới dạng cặp khóa và giá trị.

{
    "Key1": "Value1",
    "Key2": "Value2",
}

JSON rất giống với kiểu dữ liệu từ điển trong Python. Python hỗ trợ JSON và nó có một thư viện sẵn có dưới dạng JSON.

Thư viện JSON trong Python

Các mô-đun bên ngoài 'marshal''pickle' của Python duy trì một phiên bản của thư viện JSON. Để thực hiện các thao tác liên quan đến JSON như mã hóa và giải mã trong Python, trước tiên bạn cần nạp thư viện JSON trong tệp .py của bạn,

import json

Các phương thức sau đây có sẵn trong mô-đun JSON

  Phương thức

Miêu tả

  dumps()

Mã hóa thành các đối tượng JSON

  dump()

Mã hóa chuỗi được ghi trong tệp

  loads()

Giải mã chuỗi JSON

  load()

Giải mã trong khi đọc tệp JSON


Trong bài này, bạn sẽ tìm hiểu về:

  • JSON là gì?

  • Thư viện JSON trong Python

  • Python sang JSON (Mã hóa)

  • JSON sang Python (Giải mã)

    • Giải mã tệp JSON hoặc phân tích tệp JSON trong Python

    • Mã hóa tối giản trong Python

    • Định dạng mã JSON (giúp in ra đẹp hơn)

  • Mã hóa đối tượng phức trong Python

  • Giải mã đối tượng JSON phức tạp trong Python

  • Tổng quan về lớp tuần tự hóa (serialization) JSON

  • Tổng quan về lớp giải mã (deserialization) JSON

    • Giải mã dữ liệu JSON từ URL: Ví dụ thực tế.

  • Các ngoại lệ liên quan đến thư viện JSON trong Python

  • Số vô hạn và số NaN trong Python

  • Khóa lặp lại trong Chuỗi JSON

  • CLI (Giao diện dòng lệnh) với JSON trong Python

  • Ưu điểm của JSON trong Python

  • Hạn chế trong việc triển khai JSON trong Python

  • Mã cheat

Python sang JSON (Mã hóa)

Theo mặc định, thư viện Python thực hiện dịch các đối tượng Python thành các đối tượng JSON

  Python

JSON

  Từ điển (dict)

Đối tượng

  Danh sách (list)

Mảng

  unicode

Chuỗi

  Số-int,long

số - số nguyên

  float

số - số thực

  True

True

  False

False

  None

NULL

Chuyển đổi dữ liệu Python thành JSON được gọi là thao tác mã hóa. Mã hóa được thực hiện với sự trợ giúp của phương thức từ thư viện JSON - dumps()

Phương thức dumps() chuyển đổi đối tượng từ điển của python thành định dạng dữ liệu dạng chuỗi JSON.

Giờ cùng xem ví dụ mã hóa đầu tiên:

import json

x = {
  "name": "Ken",
  "age": 45,
  "married": True,
  "children": ("Alice","Bob"),
  "pets": ['Dog'],
  "cars": [
    {"model": "Audi A1", "mpg": 15.1},
    {"model": "Zeep Compass", "mpg": 18.1}
  ]
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Đầu ra:

{"person": {"name": "Kenn", "sex": "male", "age": 28}})

Hãy tạo một tệp JSON từ từ điển trên bằng cách sử dụng hàm dump()

# here we create new data_file.json file with write mode using file i/o operation 
with open('json_file.json', "w") as file_write:
# write json data into file
json.dump(person_data, file_write)

Đầu ra:

Không có gì để hiển thị…Bạn có thể kiểm tra tệp json_file.json được tạo ra trên hệ thống của mình.

JSON sang Python (Giải mã)

Đọc chuỗi JSON được thực hiện với sự trợ giúp của phương thức dựng sẵn loads() & load() của thư viện JSON trong Python. Bảng dịch dưới đây đưa ra các ví dụ về cách chuyển đổi đối tượng JSON sang đối tượng trong Python, điều này rất hữu ích trong trường hợp bạn muốn giải mã chuỗi JSON sang Python.

  JSON

Python

  Đối tượng

Từ điển (dict)

  Mảng

list (danh sách)

  Chuỗi

Unicode

  số - số nguyên (int)

số - int, long

  số -số thực (real)

float

  True

True

  False

False

  NULL

NULL

Chúng ta hãy xem một ví dụ cơ bản về việc đọc JSON trong Python với sự trợ giúp của hàm json.loads() ,

import json  # json library imported
# json data string
person_data = '{  "person":  { "name":  "Kenn",  "sex":  "male",  "age":  28}}'
# Decoding or converting JSON format in dictionary using loads()
dict_obj = json.loads(person_data)
print(dict_obj)
# check type of dict_obj
print("Type of dict_obj", type(dict_obj))
# get human object details
print("Person......",  dict_obj.get('person'))

Đầu ra:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Type of dict_obj <class 'dict'>
Person...... {'name': 'John', 'sex': 'male'}


Giải mã tệp JSON hoặc phân tách tệp JSON trong Python

LƯU Ý: Giải mã tệp JSON là thao tác liên quan tới nhập/xuất tệp. Tệp JSON phải tồn tại trên hệ thống ở vị trí mà bạn khai báo trong chương trình.

Ví dụ,

import json
#File I/O Open function for read data from JSON File
with open('X:/json_file.json') as file_object:
        # store file data in object
        data = json.load(file_object)
print(data)

Ở đây dữ liệu là một đối tượng từ điển của Python.

Đầu ra:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}


Mã hóa tối giản trong Python

Khi bạn cần giảm kích thước tệp JSON của mình, bạn có thể sử dụng mã hóa tối giản trong Python.

Ví dụ

import json
# Create a List that contains dictionary
lst = ['a', 'b', 'c',{'4': 5, '6': 7}]
# separator used for compact representation of JSON.
# Use of ',' to identify list items
# Use of ':' to identify key and value in dictionary
compact_obj = json.dumps(lst, separators=(',', ':'))
print(compact_obj)

Đầu ra:

'["a", "b", "c", {"4": 5, "6": 7}]'

Định dạng mã JSON (giúp in ra dễ nhìn hơn)

  • Mục đích là để viết những đoạn mã được định dạng rõ ràng, giúp người đọc dễ hiểu. Cùng với sự trợ giúp của việc in đẹp mắt, bất cứ ai cũng có thể dễ dàng đọc hiểu đoạn mã nguồn.

  • Ví dụ:

import json
dic = { 'a': 4, 'b': 5 }
''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))
print(formatted_obj)

Đầu ra:

{
   "a": 4,
   "b": 5
}

Để hiểu rõ hơn, thay đổi thụt lề thành 40 và quan sát đầu ra

Sắp xếp mã JSON

Thuộc tính sort_keys trong đối số của hàm dumps () sẽ sắp xếp khóa trong JSON theo thứ tự tăng dần. Đối số sort_keys là một thuộc tính kiểu Boolean. Quá trình sắp xếp được thực hiện nếu giá trị được đặt là True, và ngược lại.

Ví dụ

mport json

x = {
  "name": "Ken",
  "age": 45,
  "married": True,
  "children": ("Alice", "Bob"),
  "pets": [ 'Dog' ],
  "cars": [
    {"model": "Audi A1", "mpg": 15.1},
    {"model": "Zeep Compass", "mpg": 18.1}
  	],
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Đầu ra:

{
    "age": 45,
    "cars": [ {
        "model": "Audi A1", 
        "mpg": 15.1
    },
    {
        "model": "Zeep Compass", 
        "mpg": 18.1
    }
    ],
    "children": [ "Alice",
		  "Bob"
	],
    "married": true,
    "name": "Ken",
    "pets": [ 
		"Dog"
	]
}

Bạn có thể thấy các khóa age, cars, children…được sắp xếp theo thứ tự tăng dần.

Mã hóa đối tượng phức trong Python

Một đối tượng phức có hai phần khác nhau đó là

  • Phần thực

  • Phần ảo

Ví dụ: 3 + 2i

Trước khi thực hiện mã hóa một đối tượng phức, bạn cần kiểm tra xem liệu biến đó có phải là đối tượng phức hay không. Bạn cần tạo một hàm kiểm tra giá trị lưu trong biến bằng cách dùng hàm kiểm tra đối tượng.

Cùng viết một hàm để kiểm tra xem đối tượng có phải là phức hoặc phù hợp để mã hóa hay không.

mport json

# create function to check instance is complex or not
def complex_encode(object):
    # check using isinstance method
    if isinstance(object, complex):
        return [object.real, object.imag]
    # raised error using exception handling if object is not complex
    raise TypeError(repr(object) + " is not JSON serialized")


# perform json encoding by passing parameter
complex_obj = json.dumps(4 + 5j, default=complex_encode)
print(complex_obj)

Đầu ra:

'[4.0, 5.0]'

Giải mã đối tượng JSON phức trong Python

Để giải mã đối tượng phức trong JSON, hãy sử dụng tham số object_hook để kiểm tra chuỗi JSON có chứa đối tượng phức hay không. Ví dụ,

import json
# function check JSON string contains complex object
def is_complex(objct):
  if '__complex__' in objct:
    return complex(objct['real'], objct['img'])
  return objct
  
# use of json loads method with object_hook for check object complex or not
complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)
#here we not passed complex object so it's convert into dictionary
simple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)
print("Complex_object......",complex_object)
print("Without_complex_object......",simple_object)

Đầu ra:
 

Complex_object...... (4+5j)
Without_complex_object...... {'real': 6, 'img': 7}

Tổng quan về lớp tuần tự hóa (Serialization) JSON

Lớp JSONEncoder được sử dụng để tuần tự hóa bất kỳ đối tượng Python nào trong khi thực hiện mã hóa. Nó chứa ba phương thức mã hóa khác nhau

  • default(o) - Được triển khai trong lớp con và trả về đối tượng tuần tự cho đối tượng o.

  • encode(o) - Giống như phương thức json.dumps (), nó trả về chuỗi JSON của cấu trúc dữ liệu Python.

  • iterencode(o) – Biểu diễn từng chuỗi một và mã hóa đối tượng o.

Với sự trợ giúp của phương thức encode() thuộc lớp JSONEncoder, chúng ta cũng có thể mã hóa bất kỳ đối tượng Python nào.

# import JSONEncoder class from json
from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
# directly called encode method of JSON
JSONEncoder().encode(colour_dict)

Đầu ra:

'{"colour": ["red", "yellow", "green"]}'

Tổng quan về lớp giải mã (deserialization) JSON

Lớp JSONDecoder được sử dụng để giải mã tuần tự hóa bất kỳ đối tượng Python nào trong khi thực hiện giải mã. Nó chứa ba phương pháp giải mã khác nhau

  • default (o) - Được triển khai trong lớp con và trả về đối tượng giải mã.

  • decode (o) - Giống như phương thức json.loads(), nó trả về cấu trúc dữ liệu Python của chuỗi hoặc dữ liệu JSON.

  • raw_decode (o) – Biểu diễn từng từ điển Python và giải mã đối tượng o.

Với sự trợ giúp của phương thức decode () của lớp JSONDecoder, chúng ta cũng có thể giải mã chuỗi JSON.

import json
# import JSONDecoder class from json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
# directly called decode method of JSON
JSONDecoder().decode(colour_string)

Đầu ra:

{'colour': ['red', 'yellow']}

Giải mã dữ liệu JSON từ URL: Ví dụ thực tế

Chúng ta sẽ lấy dữ liệu của CityBike NYC (Hệ thống chia sẻ xe đạp) từ URL sau ( https://feeds.citibikenyc.com/stations/stations.json ) và chuyển đổi sang định dạng từ điển.

Ví dụ

LƯU Ý: - Đảm bảo thư viện yêu cầu đã được cài đặt trong Python của bạn, nếu không hãy mở cửa sổ dòng lệnh hoặc CMD và gõ

(Đối với Python 3 trở lên) pip3 install requests

import json
import requests

# get JSON string data from CityBike NYC using web requests library
json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")
# check type of json_response object
print(type(json_response.text))
# load data in loads() function of json library
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# now get stationBeanList key data from dict
print(bike_dict['stationBeanList'][0]) 

Đầu ra:

<class 'str'>
<class 'dict'>
{
	'id': 487,
 	'stationName': 'E 20 St & FDR Drive',
	'availableDocks': 24,
	'totalDocks': 34,
	'latitude': 40.73314259,
	'longitude': -73.97573881,
	'statusValue': 'In Service',
	'statusKey': 1,
	'availableBikes': 9,
	'stAddress1': 'E 20 St & FDR Drive',
	'stAddress2': '',
	'city': '',
}

 

Các ngoại lệ liên quan đến thư viện JSON trong Python

  • Lớp json.JSONDecoderError xử lý ngoại lệ liên quan đến hoạt động giải mã, và nó là một lớp con của ValueError.

  • Ngoại lệ - json.JSONDecoderError (msg, doc)

  • Các tham số của ngoại lệ là,

    • msg - Thông báo lỗi chưa được định dạng

    • doc - Tài liệu JSON được phân tích cú pháp

    • pos - chỉ số bắt đầu của doc khi nó thất bại

    • lineno – số dòng thể hiện tương ứng với pos

    • colon – số cột thể hiện tương ứng với pos

Ví dụ,

import json
#File I/O Open function for read data from JSON File
data = {} #Define Empty Dictionary Object
try:
    with open('json_file_name.json') as file_object:
        data = json.load(file_object)
except ValueError:
    print("Bad JSON file format,  Change JSON File")

Số vô hạn và số NaN trong Python

Định dạng trao đổi dữ liệu JSON (RFC - Yêu cầu nhận xét) không cho phép giá trị vô hạn hoặc giá trị NaN nhưng thư viện JSON của Python không có hạn chế nào đối với việc này. Nếu JSON nhận được kiểu dữ liệu vô hạn và NanN thì nó sẽ chuyển đổi sang dạng chữ.

Ví dụ,

import json
# pass float Infinite value
infinite_json = json.dumps(float('inf'))
# check infinite json type
print(infinite_json)
print(type(infinite_json))
json_nan = json.dumps(float('nan'))
print(json_nan)
# pass json_string as Infinity
infinite = json.loads('Infinity')
print(infinite)
# check type of Infinity
print(type(infinite))

Đầu ra:

 

Infinity
<class 'str'>
NaN
inf
<class 'float'>

Khóa lặp lại trong chuỗi JSON

RFC chỉ định tên khóa phải là duy nhất trong một đối tượng JSON, nhưng nó không bắt buộc. Thư viện Python JSON không đưa ra ngoại lệ đối với các đối tượng lặp lại trong JSON. Nó bỏ qua tất cả các cặp khóa-giá trị lặp lại và chỉ xem xét cặp khóa-giá trị cuối cùng trong số chúng.

Ví dụ,

import json
repeat_pair = '{"a":  1, "a":  2, "a":  3}'
json.loads(repeat_pair)

Đầu ra:

{'a': 3}

CLI (Giao diện dòng lệnh) với JSON trong Python

json.tool cung cấp giao diện dòng lệnh để xác thực cú pháp trong JSON. Hãy xem ví dụ về CLI

$ echo '{"name": "Kings Authur"}' | python3 -m json.tool

Đầu ra:
 

{

    "name": " Kings Authur "

}

Ưu điểm của JSON trong Python

  • Dễ dàng trao đổi giữa vùng chứa và giá trị (JSON sang Python và Python sang JSON)

  • Đối tượng JSON có thể đọc được

  • Được sử dụng rộng rãi trong xử lý dữ liệu.

  • Không có cùng cấu trúc dữ liệu trong một tệp.

Hạn chế trong việc triển khai JSON trong Python

  • Trong phạm vi giải mã JSON và dự đoán một số

  • Độ dài tối đa của chuỗi JSON và các mảng của JSON và các mức lồng nhau của đối tượng.

Mã Cheat

  json.dumps (person_data)

Tạo đối tượng JSON

  json.dump (person_data, file_write)

Tạo tệp JSON sử dụng nhập/xuất tệp của Python

  compact_obj = json.dumps(data, separators=(',',':'))

Tối giản đối tượng JSON bằng cách xóa ký tự khoảng trắng khỏi đối tượng JSON thông qua dấu phân cách

  formatted_obj = json.dumps (dic, indent = 4, separators = (',', ':'))

Định dạng mã JSON bằng cách sử dụng thụt lề

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

Sắp xếp khóa đối tượng JSON theo thứ tự bảng chữ cái

  complex_obj = json.dumps(4 + 5j, default=complex_encode)

Mã hóa đối tượng phức Python trong JSON

  JSONEncoder().encode(colour_dict)

Sử dụng lớp JSONEncoder để tuần tự hóa

  json.loads(data_stringi)

Giải mã chuỗi JSON trong từ điển Python bằng hàm json.loads ()

  json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)

Giải mã đối tượng JSON phức thành Python

  JSONDecoder().decode(colour_string)

Sử dụng giải mã JSON trong Python

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải