Python中巢狀自定義型別的JSON序列化與反序列化

華科雲商小雪發表於2024-02-21

對於經常用python開發得小夥伴來說,Python的JSON序列化和反序列化功能非常方便和實用。JSON(JavaScript Object Notation)其實就是一種輕量級的資料交換格式,易於閱讀和編寫,也易於機器解析和生成。在Python中,可以使用 json 模組來進行JSON序列化和反序列化操。但是再開發過程中我們還是會經歷各種各樣得問題。

1、問題背景

在Python開發中,我們經常需要將複雜的資料結構序列化為JSON字串,以便儲存或傳輸資料。然而,當資料結構中包含巢狀的自定義型別時,使用內建的json庫進行序列化可能會遇到困難。例如,我們可能需要序列化一個包含多個部門、人員和技能的組織結構。

2、 解決方案

為了解決這個問題,我們可以採用以下步驟:

  1. 定義一個自定義的JSON編碼器,以便將自定義型別轉換為字典。

  2. 使用json.dump()函式將資料序列化為JSON字串,並指定自定義編碼器。

  3. 定義一個自定義的JSON解碼器,以便將字典轉換為自定義型別。

  4. 使用json.load()函式將JSON字串反序列化為資料結構,並指定自定義解碼器。

程式碼例子

以下是一個簡單的示例,演示如何使用自定義編碼器和解碼器來序列化和反序列化一個包含巢狀自定義型別的組織結構:


import 
json


class Company( object):
    def __init__( self, company_id):
        self. company_id = company_id
        self. name = ''
        # other 10 attributes with simple type
        ...
        self. departments = [] #list of Dept objects

class Dept( object):
    def __init__( self, dept_id):
        self. dept_id = dept_id
        self. name = ''
        # other 10 attributes with simple type
        ...
        self. persons = [] #list of Person objs


class Person( object):
    def __init__( self, per_id):
        self. per_id = per_id
        self. name = ''
        # other 10 attributes with simple type
        ...
        self. skills = [] #list of Skill objs

class Skill( object):
    def __init__( self, skill_id):
        self. skill_id = skill_id
        self. name = ''
        # other 10 attributes with simple type
        ...
        self. foos = [] #list of Foo objs

class Foo( object):
    .....

def custom_encoder( obj):
    if isinstance( obj, Company):
        return { 'company_id': obj. company_id, 'name': obj. name, 'departments': obj. departments}
    elif isinstance( obj, Dept):
        return { 'dept_id': obj. dept_id, 'name': obj. name, 'persons': obj. persons}
    elif isinstance( obj, Person):
        return { 'per_id': obj. per_id, 'name': obj. name, 'skills': obj. skills}
    elif isinstance( obj, Skill):
        return { 'skill_id': obj. skill_id, 'name': obj. name, 'foos': obj. foos}
    elif isinstance( obj, Foo):
        return { 'foo_id': obj. foo_id, 'name': obj. name}
    else:
        return obj

def custom_decoder( obj):
    if 'company_id' in obj:
        return Company( obj[ 'company_id'])
    elif 'dept_id' in obj:
        return Dept( obj[ 'dept_id'])
    elif 'per_id' in obj:
        return Person( obj[ 'per_id'])
    elif 'skill_id' in obj:
        return Skill( obj[ 'skill_id'])
    elif 'foo_id' in obj:
        return Foo( obj[ 'foo_id'])
    else:
        return obj

# 序列化
company_obj = Company( 1)
json_string = json. dumps( company_obj, default = custom_encoder, sort_keys = True, indent = 4)

# 反序列化
company_obj = json. loads( json_string, object_hook = custom_decoder)

其實透過上面得了解知道,用上面得方法可以非常輕鬆的將複雜的資料結構序列化為JSON字串,並在需要時將其反序列化為原始資料結構。對於開發的小夥伴來說非常的友好,這也就是我們再開發中經常需要使用的原因。如果各位還有不懂得問題記得評論區留言討論。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006916/,如需轉載,請註明出處,否則將追究法律責任。

相關文章