在嵌套字典中序列化对象的最简单方法

7
我想序列化以下字典中所有具有"manager_objects"键的对象。最简单的方法是什么?
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: {}
            }

        }
    }

}

}


你希望最终的JSON是什么样子的?是一个Manager对象的数组吗?还是保留sub_department以维护数据结构?或者你只是想知道如何序列化自定义对象(Manager)? - justinpawela
3个回答

5
您可以编写自己的JsonEncoder(或使用@PaulDapolito所述的方法)。但是,这两种方法仅适用于您知道具有键“ manager_object”的项目的类型。
从文档中了解:要使用自定义的JSONEncoder子类(例如,覆盖default()方法以序列化其他类型的对象),请在cls kwarg中指定它;否则将使用JSONEncoder。
# 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)

4

在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__)

3

如果你的字典包含了Python/json默认无法序列化的对象,那么你需要给json.dumpjson.dumps方法传递一个函数作为default关键字参数来告诉它如何序列化这些对象。例如:

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)

这个运行得非常好!谢谢!有没有办法为默认值发送不同的函数。比如说,我在字典中有两个不同的对象(manager_object和employee_object),我能定义两个函数并将它们传递给json.dumps吗? - Jiyda Moussa
只需在您的序列化函数中检查更多的对象实例即可。您可以这样说:“else if isinstance(obj, employee): serial= ....” - PaulDapolito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接