递归地将python对象图转换为字典

新手上路,请多包涵

我正在尝试将数据从简单的对象图转换为字典。我不需要类型信息或方法,也不需要能够再次将其转换回对象。

我发现 了这个关于从对象的字段创建字典的问题,但它不是递归地做的。

作为 python 的新手,我担心我的解决方案可能很丑陋,或者不符合 pythonic,或者以某种晦涩的方式被破坏,或者只是普通的旧 NIH。

我的第一次尝试似乎奏效了,直到我用列表和字典尝试它,而且检查传递的对象是否有内部字典似乎更容易,如果没有,就把它当作一个值(而不是做所有的实例检查).我以前的尝试也没有递归到对象列表中:

 def todict(obj):
    if hasattr(obj, "__iter__"):
        return [todict(v) for v in obj]
    elif hasattr(obj, "__dict__"):
        return dict([(key, todict(value))
            for key, value in obj.__dict__.iteritems()
            if not callable(value) and not key.startswith('_')])
    else:
        return obj

这似乎工作得更好并且不需要例外,但我仍然不确定这里是否有案例我不知道它在哪里失败。

任何建议将不胜感激。

原文由 Shabbyrobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 554
2 个回答

结合我自己的尝试和从 Anurag Uniyal 和 Lennart Regebro 的回答中得到的线索对我来说最有效:

 def todict(obj, classkey=None):
    if isinstance(obj, dict):
        data = {}
        for (k, v) in obj.items():
            data[k] = todict(v, classkey)
        return data
    elif hasattr(obj, "_ast"):
        return todict(obj._ast())
    elif hasattr(obj, "__iter__") and not isinstance(obj, str):
        return [todict(v, classkey) for v in obj]
    elif hasattr(obj, "__dict__"):
        data = dict([(key, todict(value, classkey))
            for key, value in obj.__dict__.items()
            if not callable(value) and not key.startswith('_')])
        if classkey is not None and hasattr(obj, "__class__"):
            data[classkey] = obj.__class__.__name__
        return data
    else:
        return obj

原文由 Shabbyrobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

一行代码递归地将对象转换为 JSON。

 import json

def get_json(obj):
  return json.loads(
    json.dumps(obj, default=lambda o: getattr(o, '__dict__', str(o)))
  )

obj = SomeClass()
print("Json = ", get_json(obj))

原文由 Archit Dwivedi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题