将动态python对象转换为json

Tre*_*vor 62 python json

可能重复:
Python可序列化对象json

我需要知道如何将动态python对象转换为JSON.该对象必须能够具有多个对象子对象.例如:

class C(): pass
class D(): pass

c = C()
c.dynProperty1 = "something"
c.dynProperty2 = { 1, 3, 5, 7, 9 }
c.d = D()
c.d.dynProperty3 = "d.something"

# ... convert c to json ...
Run Code Online (Sandbox Code Playgroud)

使用python 2.6以下代码:

import json

class C(): pass
class D(): pass

c = C()
c.what = "now?"
c.now = "what?"
c.d = D()
c.d.what = "d.what"

json.dumps(c.__dict__)
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

TypeError: <__main__.D instance at 0x99237ec> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

我不知道用户可能会放入哪些类型的子对象c.是否存在足够智能的解决方案来检测属性是否为对象并__dict__自动解析?

更新以包括子对象c.

phi*_*hag 121

指定default=参数(doc):

json.dumps(c, default=lambda o: o.__dict__)
Run Code Online (Sandbox Code Playgroud)

  • 我的对象的一个​​属性是datetime,我有''AttributeError'对象没有属性'__dict __' (5认同)
  • @soulmachine你的代码只是转储一个字典,其值(和值的值,递归)可能仍然是没有JSON表示的Python对象.本回答中的代码以递归方式使用对象的`__dict__`来表示所有有问题的对象. (4认同)
  • @soulmachine来自Python3 [文档](https://docs.python.org/3/library/json.html#json.dump):*如果指定,默认应该是一个函数,可以调用不能的对象否则被序列化.它应该返回对象的JSON可编码版本或引发TypeError.如果未指定,则引发TypeError.* (2认同)

Aus*_*all 17

json.dumps(c.__dict__)
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个通用的JSON对象,如果这是你想要的.

  • 在查看 phihag 的评论后,我做了一些进一步的测试,并意识到这个解决方案并不适用于所有情况......更新问题...... (2认同)

fun*_*ron 8

尝试使用这个包python-jsonpickle

用于将任意对象图序列化为JSON的Python库.它几乎可以占用任何Python对象并将对象转换为JSON.此外,它可以将对象重新构建回Python.