我是Python的新手,我有这个相当大而复杂的数据结构,它是一个包含不同对象列表的字典列表。当我尝试通过json.dumps()将其转换为JSON时,我得到了标准
TypeError: <...> is not JSON serializable
我做了一些研究,大多数答案指向编写自定义编码器的标准方法,这很好,我可以做到。但是,我希望能够将我的整个数据结构发送到json.dumps()而不是遍历所有内容,找出它是什么类,并从头开始构建一个json对象。
有没有办法将编码器/解码器函数添加到python类本身,所以当我向json.dumps发送一个复杂的数据结构时,类本身就知道该怎么做。
是否有一些神奇的 to_json 或者某种方式将自定义解码器添加到json.dumps运行时调用的类?
答案 0 :(得分:1)
使用json.dumps(my_object, cls=MyCustomJsonEncoder)
时,自定义编码器类会为您处理。您的自定义编码器将覆盖default
方法,该方法需要self
和对象o
进行编码;测试需要自定义序列化的不同类型,并使用super(MyCustomJsonEncoder, self).default(o)
将其余类型传递给默认值。
我经常使用的一个简单示例如下:
class JSONEncoder(json.JSONEncoder):
"""
Enhancement of base JSONEncoder, also handling these objects:
* datetime.datetime
* decimal.Decimal
* uuid.UUID
"""
def default(self, o):
if isinstance(o, Decimal):
return float(o)
elif isinstance(o, UUID):
return str(o)
elif isinstance(o, datetime):
return {
'__type__': 'datetime',
'__value__': o.isoformat(),
}
return super(JSONEncoder, self).default(o)
@staticmethod
def dumps(obj):
return json.dumps(obj, cls=JSONEncoder)
答案 1 :(得分:1)
正如史蒂芬沃尔夫在this thread中所说,你可能想看看jsonpickle。该库允许对复杂的Python对象进行编码和解码。
你可以这样使用它:
import jsonpickle
f = open(filename, 'w')
encoded_string = jsonpickle.encode(obj)
f.write(encoded_string)
f.close()
要将数据检索为Python对象,只需使用jsonpickle.decode(encoded_string)
方法即可。正如文档所说:
新对象具有相同的类型和数据,但现在基本上是原始对象的副本。
我认为这对您有用。