技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

4種方法使Python類JSON可序列化

作者:admin    時間:2021-12-29 8:41:11    瀏覽:

有多種方法可以使 Python 類 JSON 可序列化,本文將介紹4種方法使 Python 類 JSON 可序列化,你可以選擇最適合你的一種。

 解釋了如何使 Python 類 JSON 可序列化
解釋了如何使 Python 類 JSON 可序列化

編寫自定義 JSONEncoder 使類 JSON 可序列化

Python json 模塊有一個JSONEncoder類。如果你想要更多自定義輸出,你可以擴展它,即你必須繼承 JSONEncoder,以便你可以實現(xiàn)自定義 JSON 序列化。

JSON 模塊的json.dump()json.dumps()方法有一個cls kwarg。使用這個參數(shù),你可以傳遞一個自定義的 JSON 編碼器,它告訴json.dump()json.dumps()方法如何將你的對象編碼為 JSON 格式的數(shù)據(jù)。默認的 JSONEncoder 類有一個default()方法,當(dāng)我們執(zhí)行JSONEncoder.encode(object),此方法僅將基本類型轉(zhuǎn)換為 JSON。

你的自定義 JSONEncoder 子類將覆蓋該default()方法以序列化其他類型。使用json.dumps()方法的cls kwarg指定它,否則,將使用默認的 JSONEncoder。例子:json.dumps(cls=CustomEncoder)?,F(xiàn)在讓我們看看這個例子。

import json
from json import JSONEncoder

class Employee:
    def __init__(self, name, salary, address):
        self.name = name
        self.salary = salary
        self.address = address

class Address:
    def __init__(self, city, street, pin):
        self.city = city
        self.street = street
        self.pin = pin

# subclass JSONEncoder
class EmployeeEncoder(JSONEncoder):
        def default(self, o):
            return o.__dict__

address = Address("Alpharetta", "7258 Spring Street", "30004")
employee = Employee("John", 9000, address)

print("Printing to check how it will look like")
print(EmployeeEncoder().encode(employee))

print("Encode Employee Object into JSON formatted Data using custom JSONEncoder")
employeeJSONData = json.dumps(employee, indent=4, cls=EmployeeEncoder)
print(employeeJSONData)

# Let's load it using the load method to check if we can decode it or not.
print("Decode JSON formatted Data")
employeeJSON = json.loads(employeeJSONData)
print(employeeJSON)

輸出:

Printing to check how it will look like
{"name": "John", "salary": 9000, "address": {"city": "Alpharetta", "street": "7258 Spring Street", "pin": "30004"}}

Encode Object into JSON formatted Data using custom JSONEncoder
{
    "name": "John",
    "salary": 9000,
    "address": {
        "city": "Alpharetta",
        "street": "7258 Spring Street",
        "pin": "30004"
    }
}

Decode JSON formatted Data
{'name': 'John', 'salary': 9000, 'address': {'city': 'Alpharetta', 'street': '7258 Spring Street', 'pin': '30004'}}

注意:

  • EmployeeEncoder 類覆蓋了類的default()方法JSONEncoder,因此我們能夠?qū)⒆远x Python 對象轉(zhuǎn)換為 JSON。
  • EmployeeEncoder 類中,我們將對象轉(zhuǎn)換為 Python 字典格式。

使用 toJSON() 方法使類 JSON 可序列化

一個簡單直接的解決方案,我們可以在類中實現(xiàn)一個序列化器方法,而不是使類 JSON 可序列化。

所以我們不需要編寫自定義的 JSONEncoder。

這個新的toJSON()序列化器方法將返回對象的 JSON 表示,即它將自定義Python對象轉(zhuǎn)換為JSON字符串。讓我們看看例子。

import json

class Employee:
    def __init__(self, name, salary, address):
        self.name = name
        self.salary = salary
        self.address = address

    def toJson(self):
        return json.dumps(self, default=lambda o: o.__dict__)

class Address:
    def __init__(self, city, street, pin):
        self.city = city
        self.street = street
        self.pin = pin

address = Address("Alpharetta", "7258 Spring Street", "30004")
employee = Employee("John", 9000, address)

print("Encode into JSON formatted Data")
employeeJSONData = json.dumps(employee.toJson(), indent=4)
print(employeeJSONData)

# Let's load it using the load method to check if we can decode it or not.
print("Decode JSON formatted Data")
employeeJSON = json.loads(employeeJSONData)
print(employeeJSON)

輸出:

Encode into JSON formatted Data
"{\"name\": \"John\", \"salary\": 9000, \"address\": {\"city\": \"Alpharetta\", \"street\": \"7258 Spring Street\", \"pin\": \"30004\"}}"

Decode JSON formatted Data
{"name": "John", "salary": 9000, "address": {"city": "Alpharetta", "street": "7258 Spring Street", "pin": "30004"}}

注意:

如你所見,我們能夠?qū)?Employee 對象編碼和解碼為 JSON 格式的流。

我們使用json.dumps()方法的default參數(shù)將附加類型序列化為 dict 并將新創(chuàng)建的 dict 轉(zhuǎn)換為 JSON 字符串。

使用 jsonpickle 模塊使類 JSON 可序列化

jsonpickle 是一個 Python 庫,旨在處理復(fù)雜的 Python 對象。你可以使用 jsonpickle 將復(fù)雜的 Python 對象序列化為 JSON。此外,還有從 JSON 反序列化到復(fù)雜的 Python 對象。

如你所知,Python的內(nèi)置json 模塊只能處理具有直接 JSON 等效項的 Python 原語類型(例如,字典、列表、字符串、數(shù)字、無等)。

jsonpickle 構(gòu)建在這些庫之上,并允許將更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)序列化為 JSON。jsonpickle 是高度可配置和可擴展的——允許用戶選擇 JSON 后端并添加額外的后端。

步驟:

  • 安裝 jsonpickle 使用 pip install jsonpickle
  • 執(zhí)行jsonpickle.encode(object)以序列化自定義 Python 對象。
     

你可以參考Jsonpickle 文檔了解更多詳細信息。讓我們看一下 jsonpickle 示例,使 Python 類 JSON 可序列化。

import json
import jsonpickle
from json import JSONEncoder

class Employee(object):
    def __init__(self, name, salary, address):
        self.name = name
        self.salary = salary
        self.address = address

class Address(object):
    def __init__(self, city, street, pin):
        self.city = city
        self.street = street
        self.pin = pin

address = Address("Alpharetta", "7258 Spring Street", "30004")
employee = Employee("John", 9000, address)

print("Encode Object into JSON formatted Data using jsonpickle")
empJSON = jsonpickle.encode(employee, unpicklable=False)

print("Writing JSON Encode data into Python String")
employeeJSONData = json.dumps(empJSON, indent=4)
print(employeeJSONData)

print("Decode JSON formatted Data using jsonpickle")
EmployeeJSON = jsonpickle.decode(employeeJSONData)
print(EmployeeJSON)

# Let's load it using the load method to check if we can decode it or not.
print("Load JSON using loads() method")
employeeJSON = json.loads(EmployeeJSON)
print(employeeJSON)

輸出:

Encode Object into JSON formatted Data using jsonpickle
Writing JSON Encode data into Python String
"{\"address\": {\"city\": \"Alpharetta\", \"pin\": \"30004\", \"street\": \"7258 Spring Street\"}, \"name\": \"John\", \"salary\": 9000}"

Decode JSON formatted Data using jsonpickle
{"address": {"city": "Alpharetta", "pin": "30004", "street": "7258 Spring Street"}, "name": "John", "salary": 9000}

Load JSON using loads() method
{'address': {'city': 'Alpharetta', 'pin': '30004', 'street': '7258 Spring Street'}, 'name': 'John', 'salary': 9000}

注意:

我使用unpicklable=False是因為我不想將此數(shù)據(jù)解碼回 Object,如果你希望將 JSON 解碼回員工對象,請使用unpicklable=True,或者直接將 JSON 數(shù)據(jù)加載到 Object 中。

此外,你可以嘗試使用jsons模塊使類 JSON 可序列化。

從 dict 繼承以使類 JSON 可序列化

如果你不想編寫自定義編碼器,并且不愿意使用 jsonpickle,則可以使用此解決方案。檢查此解決方案是否適合你。如果你的類不復(fù)雜,則此解決方案有效。對于更棘手的事情,你必須明確設(shè)置鍵。

此方法對于那些無法修改其json.dumps(obj)調(diào)用以包含自定義編碼器的人很有用, 即如果你想按json.dumps(obj)原樣調(diào)用,那么一個簡單的解決方案是從 dict 繼承。

因此,在這種情況下,你無需將調(diào)用更改為json.dumps(),我的意思是,如果你傳遞一個對象并且 JSON 轉(zhuǎn)儲發(fā)生在不同的應(yīng)用程序組件或框架中,你無法控制修改json.dumps()調(diào)用,該怎么辦?

讓我們看看演示。

import json

class Employee(dict):
    def __init__(self, name, age, salary, address):
        dict.__init__(self, name=name, age=age, salary=salary, address=address)

class Address(dict):
    def __init__(self, city, street, pin):
        dict.__init__(self, city=city, street=street, pin=pin)

address = Address("Alpharetta", "7258 Spring Street", "30004")
employee = Employee("John", 36, 9000, address)

print("Encode into JSON formatted Data")
employeeJSON = json.dumps(employee)
print(employeeJSON)

# Let's load it using the load method to check if we can decode it or not.
print("Decode JSON formatted Data")
employeeJSONData = json.loads(employeeJSON)
print(employeeJSONData)

輸出:

Encode into JSON formatted Data
{"name": "John", "age": 36, "salary": 9000, "address": {"city": "Alpharetta", "street": "7258 Spring Street", "pin": "30004"}}

Decode JSON formatted Data
{'name': 'John', 'age': 36, 'salary': 9000, 'address': {'city': 'Alpharetta', 'street': '7258 Spring Street', 'pin': '30004'}}

總結(jié)

本文介紹了4種方法使Python類JSON可序列化,你可以根據(jù)自己的實際情況或喜好,選擇最合適你的一種。

您可能對以下文章也感興趣

標簽: Python  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */