【问题标题】:Python's JSON module doesn't use __get__?Python 的 JSON 模块不使用 __get__?
【发布时间】:2010-02-10 17:18:49
【问题描述】:

当我使用自定义__get__ 方法序列化对象列表时,不会调用__get__,而是使用来自__set__ 的原始(未经自定义__get__ 处理)值。 Python 的json 模块如何迭代一个项目?

注意:如果我在序列化之前遍历列表,则使用__get__ 返回的正确值。

【问题讨论】:

  • 你能举个例子吗?
  • __get____set__ 方法用于描述符协议,这里似乎并不适用。只有当它们是类的属性,并且您在类或其实例上获取或设置这些属性时才应调用它们。
  • 这很有趣,我认为由于在分配值时会调用__set__,所以在检索时总是会调用__get__

标签: python json


【解决方案1】:

它检查对象是否是某些值,或者是列表、元组或字典的实例...

它提供了如果所有这些都失败了该怎么办的方法,并记录了如何做到这一点:


import simplejson
class IterEncoder(simplejson.JSONEncoder):
  def default(self, o):
    try:
      iterable = iter(o)
    except TypeError:
      pass
    else:
      return list(iterable)
    return simplejson.JSONEncoder.default(self, o)

simplejson.dumps(YourObject,cls=IterEncoder)

【讨论】:

  • 实际上,我已经在使用自定义 json 编码器了。它只是被赋予原始值,而不是__get__ 的结果。有什么想法吗?
  • 你能发布一个你试图序列化的对象的例子吗?从目前看来,如果您使用的是这样的编码器,那么迭代的对象将在列表chunks 中传递到"".join(chunks)
【解决方案2】:

来自 Python 3.1.2 文档(重新格式化以便在此处查看,但未编辑):

json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
          allow_nan=True, cls=None, indent=None, separators=None,
          default=None, **kw)

default(obj) 是一个应该返回 obj 的可序列化版本或引发 TypeError 的函数。默认只是引发 TypeError

所以你的__get__ 函数应该被传递为default=yourcustomjsonencoder.__get__ 或类似的东西?只是一个想法。我可能会走得很远(而且可能是),但至少这是一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多