Python 在嵌套字典中序列化对象的最简单方法
我想序列化以下字典中具有键“manager\u objects”的所有对象。最简单的方法是什么Python 在嵌套字典中序列化对象的最简单方法,python,json,Python,Json,我想序列化以下字典中具有键“manager\u objects”的所有对象。最简单的方法是什么 department { id: 1, name: 'ARC', manager_object: <Object> sub_department: { id: 5, name: 'ABC' manager_object: <Object> sub_department: { id: 7, name: 'TRW',
department {
id: 1,
name: 'ARC',
manager_object: <Object>
sub_department: {
id: 5,
name: 'ABC'
manager_object: <Object>
sub_department: {
id: 7,
name: 'TRW',
manager_object: <Object>
sub_department: {
id: 9,
name: 'MYT',
manager_object: <Object>
sub_deparment: {
id: 12,
name: 'NMY'
manager_object: <Object>
sub_department: {}
}
}
}
}
部门{
id:1,
名称:“ARC”,
管理器对象:
分科:{
id:5,
姓名:“ABC”
管理器对象:
分科:{
id:7,
名称:“TRW”,
管理器对象:
分科:{
id:9,
名称:“MYT”,
管理器对象:
分部:{
id:12,
名称:“NMY”
管理器对象:
分部:{}
}
}
}
}
}如果您的字典包含Python/
json
默认情况下不知道如何序列化的对象,则需要为json.dump
或json.dumps
提供一个函数作为其默认
关键字,告诉它如何序列化这些对象。举例来说:
import json
class Friend(object):
def __init__(self, name, phone_num):
self.name = name
self.phone_num = phone_num
def serialize_friend(obj):
if isinstance(obj, Friend):
serial = obj.name + "-" + str(obj.phone_num)
return serial
else:
raise TypeError ("Type not serializable")
paul = Friend("Paul", 1234567890)
john = Friend("John", 1234567890)
friends_dict = {"paul": paul, "john": john}
print json.dumps(friends_dict, default=serialize_friend)
您可以编写自己的JsonEncoder(或者使用@PaulDapolito描述的方法)。但,这两种方法只有在您知道键为
manager\u object
的项的类型时才有效。
From docs:要使用自定义的JSONECODER子类(例如,重写default()方法以序列化其他类型的子类),请使用cls kwarg指定它;否则使用JSONECODER
# Example of custom encoder
class CustomJsonEncoder(json.JSONEncoder):
def default(self, o):
# Here you can serialize your object depending of its type
# or you can define a method in your class which serializes the object
if isinstance(o, (Employee, Autocar)):
return o.__dict__ # Or another method to serialize it
else:
return json.JSONEncoder.encode(self, o)
# Usage
json.dumps(items, cls=CustomJsonEncoder)
默认情况下,Python中的嵌套字典、枚举、日期、时间和日期时间不可序列化。下面是我处理这些类型的方法
from datetime import time
from datetime import datetime
from datetime import timedelta
import json
import enum
def to_serializable(val):
"""JSON serializer for objects not serializable by default"""
if isinstance(val, (datetime, date, time)):
return val.isoformat()
elif isinstance(val, enum.Enum):
return val.value
elif hasattr(val, '__dict__'):
return val.__dict__
return val
def to_json(data):
"""Converts object to JSON formatted string"""
return json.dumps(data, default=to_serializable)
# example on how to serialize dict
to_json(mydict.__dict__)
您希望生成的JSON看起来像什么?
Manager
对象的数组?或者您是否也保留子部门
s以维护数据结构?或者您只是想知道如何序列化自定义对象(管理器<代码>管理器代码>)?这就像一个符咒!非常感谢。是否有一种方法可以为默认设置发送不同的函数。假设字典中有两个不同的对象(manager\u对象和employee\u对象),我可以定义两个函数并将它们传递给json.dumps吗?只需检查序列化函数中的更多对象实例。您可能会说:else if is instance(obj,employee):serial=..