在一个将数据保存在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]
这怎么能起作用?
答案 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__)
希望有所帮助。