【问题标题】:Convert dynamic python object to json [duplicate]将动态python对象转换为json [重复]
【发布时间】:2011-11-16 13:01:48
【问题描述】:

可能重复:
Python serializable objects 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 ...

使用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__)

产生以下错误:

TypeError: <__main__.D instance at 0x99237ec> is not JSON serializable

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

更新以包含c 上的子对象。

【问题讨论】:

  • 除了动态元素——我不知道在对象被序列化成json之前可能会添加什么属性。
  • 您也会注意到重复作品的解决方案。
  • @phihag:感谢您指出这一点。它帮助我意识到我的问题比我想象的要多(请参阅更新的问题)。
  • 那么你可能应该问一个新问题。特别注意不要包含无效的示例代码。例如,您想要class C(object): pass。我添加了一个应该可以解决您的问题的答案。
  • 糟糕,对不起,我完全错了。 class C(): pass 当然是有效,但它在 Python 2.x 中创建了一个旧式类(就像 class C: pass 一样)。老式的类是奇怪的野兽。通过从 object 继承,您可以获得更理智的新风格行为。

标签: python json


【解决方案1】:

指定default=参数(doc):

json.dumps(c, default=lambda o: o.__dict__)

【讨论】:

  • 我的对象的一个​​属性是日期时间,我有'AttributeError' object has no attribute '__dict__'
  • @arun 对于一组,您将使用不同的方法。如果您希望同时使用对象和集合,请使用辅助函数而不是 lambda,测试 isinstance(o, set),然后返回类似 list(o) 的内容。
  • 这个比json.dumps(c.__dict__)好用,为什么?
  • @soulmachine 您的代码只是转储了一个字典,其值(以及递归的值)可能仍然是没有 JSON 表示的 Python 对象。此答案中的代码递归地使用对象的 __dict__ 来处理所有有问题的对象。
  • @soulmachine 来自 Python3 documentation如果指定,默认应该是一个函数,该函数会被调用以处理无法序列化的对象。它应该返回对象的 JSON 可编码版本或引发 TypeError。如果未指定,则引发 TypeError。
【解决方案2】:
json.dumps(c.__dict__)

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

【讨论】:

  • 在查看了 phihag 的评论后,我做了一些进一步的测试,并意识到这个解决方案在所有情况下都不起作用......更新问题......
  • 这也适用于我。
【解决方案3】:

试试这个包python-jsonpickle

用于将任意对象图序列化为 JSON 的 Python 库。它可以接受几乎任何 Python 对象并将对象转换为 JSON。此外,它还可以将对象重构回 Python。

【讨论】:

    【解决方案4】:

    json.dumps 需要一个字典作为参数。对于实例c,属性c.__dict__是一个字典,将属性名称映射到相应的对象。

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2015-01-02
      • 2020-11-02
      • 1970-01-01
      相关资源
      最近更新 更多