2

在一个将数据保存在 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)

这工作得很好。但现在我想插入fooMongoDB:

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]

这怎么能起作用?

4

1 回答 1

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文档中的文档] TypeError:非序列上的迭代

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

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

或者,使用__dict__

db.foobars.insert(foo.__dict__)

希望有帮助。

于 2013-07-26T21:35:02.930 回答