(De-)使用PyMongo和JSON进行序列化

时间:2013-07-26 13:52:35

标签: python json mongodb serialization pymongo

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

因此,对于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]

这怎么能起作用?

1 个答案:

答案 0 :(得分:1)

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

  

文件   “/home/alexander/.virtualenvs/so/local/lib/python2.7/site-packages/pymongo/collection.py”   第351行,插入       docs = [self .__ database._fix_incoming(doc,self)for docs 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__)

希望有所帮助。