【问题标题】:(De-)Serialization with PyMongo and JSON使用 PyMongo 和 JSON 进行(反)序列化
【发布时间】:2013-07-26 19:56:56
【问题描述】:

在将数据保存在 MongoDB 中并且还通过(只读)RESTish JSON API 公开一些数据的项目中,处理 Python 对象需要一些额外的工作。序列化和反序列化仅在处理字典或其他简单类型(如字符串)时自动工作。

所以对于 JSON 序列化,我想出了这个:

import json

class Encoder(json.JSONEncoder):
  def default(self, obj):
    if isinstance(obj, Foo):
      return {'bar': obj.bar}
    return json.JSONEncoder.fault(self, obj)

class Foo:
  def __init__(self, bar):
    self.bar = bar

foo = Foo("bar")
encoded = json.dumps(tokens, cls=Encoder)

这很好用。但现在我想将foo 插入 MongoDB:

db.foobars.insert(foo)

显然这不起作用:

Traceback (most recent call last):
  ...
    db.foobars.insert(foo)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 351, in insert
    docs = [self.__database._fix_incoming(doc, self) for doc in docs]

这怎么能起作用?

【问题讨论】:

    标签: python json mongodb serialization pymongo


    【解决方案1】:

    通过调用db.foobars.insert(foo),您正在尝试插入Foo 类的实例。 insert 方法只允许一个字典或字典列表作为第一个参数。这就是您看到错误的原因:

    文件 “/home/alexander/.virtualenvs/so/local/lib/python2.7/site-packages/pymongo/collection.py”, 第 351 行,插入 docs = [self.__database._fix_incoming(doc, self) for doc in docs] TypeError: 非序列迭代

    解决此问题的一种方法是将encoded 字符串加载回dict:

    foo = Foo("bar")
    encoded = json.dumps(foo, cls=Encoder)
    db.foobars.insert(json.loads(encoded))
    

    或者,使用__dict__

    db.foobars.insert(foo.__dict__)
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多