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序列化之旅:深入理解.NET中的JsonResult與自定義ContractResolverJSON
- system.text.Json 針對繼承多型型別的集合,使用自定義Converter,進行json序列化JSON繼承多型型別
- json序列化與反序列化 (map,struct, slice, 基本資料型別)JSONStruct資料型別
- Flutter中JSON序列化與反序列化FlutterJSON
- Python中序列化/反序列化JSON格式的資料PythonJSON
- Python學習——序列化與反序列化-json&picklePythonJSON
- Go 中時間型別欄位的 JSON 序列化和反序列化的處理技巧Go型別JSON
- java自定義序列化Java
- C#支援將json中的多種型別反序列化為object型別C#JSON型別Object
- jackson對Exception型別物件的序列化與反序列化Exception型別物件
- C# 中使物件序列化/反序列化 Json 支援使用派生型別以及泛型的方式C#物件JSON型別泛型
- JSON序列化時將BigDecimal型別轉換成String型別JSONDecimal型別
- Java物件的序列化與反序列化-Json篇Java物件JSON
- springboot自定義ObjectMapper序列化、配置序列化對LocalDateTime的支援Spring BootObjectAPPLDA
- 詳解電子表格中的json資料:序列化與反序列化JSON
- Python .get 巢狀 JSON 值Python巢狀JSON
- Swift 中的 JSON 反序列化SwiftJSON
- springbootredis自定義序列化方式(fastJson)Spring BootRedisASTJSON
- Python常用標準庫(pickle序列化和JSON序列化)PythonJSON
- python json反序列化為物件PythonJSON物件
- 【SpringBoot】 中時間型別 序列化、反序列化、格式處理Spring Boot型別
- 聊聊 Go 語言中的 JSON 序列化與 js 前端互動型別失真問題GoJSON前端型別
- Java中的序列化與反序列化Java
- 屬性序列化自定義與字母表排序-JSON框架Jackson精解第3篇排序JSON框架
- python 序列化pickle&json模組PythonJSON
- 在Springboot + Mybaitis-plus 專案中利用Jackson實現json對java多型的(反)序列化Spring BootAIJSONJava多型
- JSON-B:簡化 JSON 序列化和反序列化JSON
- @JsonCreator自定義反序列化函式-JSON框架Jackson精解第5篇JSON函式框架
- SpringBoot 預設json解析器詳解和欄位序列化自定義Spring BootJSON
- Kotlin Json 序列化KotlinJSON
- Json序列化在golang中的應用JSONGolang
- Python中物件序列化和反序列化Python物件
- JSON.NET與LINQ序列化示例JSON
- C#序列化和反序列化(json)C#JSON
- Newtonsoft序列化與反序列化json字串使用方法總結JSON字串
- Python之資料序列化(json、pickle、shelve)PythonJSON
- JSON繼承JsonConverter序列化與反序列化重寫類屬性JSON繼承
- python的序列化和反序列化Python