Python中巢狀自定義型別的JSON序列化與反序列化
json
模組來進行JSON序列化和反序列化操。但是再開發過程中我們還是會經歷各種各樣得問題。
1、問題背景
2、 解決方案
為了解決這個問題,我們可以採用以下步驟:
-
定義一個自定義的JSON編碼器,以便將自定義型別轉換為字典。
-
使用json.dump()函式將資料序列化為JSON字串,並指定自定義編碼器。
-
定義一個自定義的JSON解碼器,以便將字典轉換為自定義型別。
-
使用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)
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006916/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- json序列化與反序列化 (map,struct, slice, 基本資料型別)JSONStruct資料型別
- Flutter中JSON序列化與反序列化FlutterJSON
- system.text.Json 針對繼承多型型別的集合,使用自定義Converter,進行json序列化JSON繼承多型型別
- Redis序列化儲存Java集合List等自定義型別RedisJava型別
- 用Jackson自定義JSON反序列化JSON
- Python中序列化/反序列化JSON格式的資料PythonJSON
- Python中類的JSON序列化PythonJSON
- java自定義序列化Java
- JSON序列化之旅:深入理解.NET中的JsonResult與自定義ContractResolverJSON
- Python學習——序列化與反序列化-json&picklePythonJSON
- 自定義Object與XML互換(序列化)ObjectXML
- C#支援將json中的多種型別反序列化為object型別C#JSON型別Object
- 在C#中實現Json的序列化與反序列化C#JSON
- C# 中使物件序列化/反序列化 Json 支援使用派生型別以及泛型的方式C#物件JSON型別泛型
- C# 序列化與反序列化jsonC#JSON
- Java物件的序列化與反序列化-Json篇Java物件JSON
- jackson對Exception型別物件的序列化與反序列化Exception型別物件
- python 學習 -- json的序列化和反序列化PythonJSON
- Go 中時間型別欄位的 JSON 序列化和反序列化的處理技巧Go型別JSON
- C# Json 序列化與反序列化一C#JSON
- C# Json 序列化與反序列化二C#JSON
- 詳解電子表格中的json資料:序列化與反序列化JSON
- .Net Core 自定義序列化格式
- Java中的序列化與反序列化Java
- Swift 中的 JSON 反序列化SwiftJSON
- .NET 中Newtonsoft的使用 自定義物件的序列化物件
- JSON序列化時將BigDecimal型別轉換成String型別JSONDecimal型別
- [golang] 結構體json序列化時,如何自定義時間格式Golang結構體JSON
- php中序列化與反序列化PHP
- JSON 物件序列化、反序列化JSON物件
- Python常用標準庫(pickle序列化和JSON序列化)PythonJSON
- Android 中的Json解析工具fastjson 、序列化、反序列化AndroidJSONAST
- Python序列化模組pickle和json使用和區別PythonJSON
- C#中物件的序列化與反序列化C#物件
- Python中物件序列化和反序列化Python物件
- springboot自定義ObjectMapper序列化、配置序列化對LocalDateTime的支援Spring BootObjectAPPLDA
- Python .get 巢狀 JSON 值Python巢狀JSON
- python 序列化pickle&json模組PythonJSON