在python中将pymongo查询集序列化为json

Posted

技术标签:

【中文标题】在python中将pymongo查询集序列化为json【英文标题】:Serialize pymongo queryset to json in python 【发布时间】:2014-02-18 15:20:02 【问题描述】:

背景: 这符合预期:

>>> queryset = FIRM.find_one('_id':ObjectId("52e56c009dbc794999ea5c3d"),'wholesalers.name':1,'wholesalers.id':1,'_id':0) 
>>> simplejson.dumps(queryset,default = json_util.default)
'"wholesalers": ["id": "$oid": "52e56c009dbc794999ea5c3c", "name": "wholesaler1"]'

但是这不是

>>> queryset = FIRM.find('_id':ObjectId("52e56c009dbc794999ea5c3d"),'wholesalers.name':1,'wholesalers.id':1,'_id':0) 
>>> simplejson.dumps(queryset,default = json_util.default)


Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/simplejson-3.3.1-py2.7-linux-i686.egg/simplejson/__init__.py", line 369, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python2.7/dist-packages/simplejson-3.3.1-py2.7-linux-i686.egg/simplejson/encoder.py", line 262, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python2.7/dist-packages/simplejson-3.3.1-py2.7-linux-i686.egg/simplejson/encoder.py", line 340, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python2.7/dist-packages/pymongo-2.6.3-py2.7-linux-i686.egg/bson/json_util.py", line 220, in default
    raise TypeError("%r is not JSON serializable" % obj)
TypeError: <pymongo.cursor.Cursor object at 0x109774ac> is not JSON serializable

我想将查询集序列化为 json

【问题讨论】:

【参考方案1】:

在第一个 sn-p 中,您分配给变量 queryset 的对象是一个(单个)文档(find_one 返回一个文档)。 IE。从数据库获取文档,并存储在内存中。文档是 json 序列化的,所以它可以工作。

在第二个 sn-p 中,您分配给 queryset 的对象是 Cursor。结果文档还没有被提取,它们只有在你遍历游标时才会被提取。游标不是 json-serializable,因为它不代表文档,而是生成文档的 generator。所以你可以做的是先获取所有文档,然后序列化文档列表:

>>> queryset = FIRM.find('_id':ObjectId("52e56c009dbc794999ea5c3d"),'wholesalers.name':1,'wholesalers.id':1,'_id':0) 
>>> docs = list(queryset)  # fetch the documents
>>> simplejson.dumps(documents, default = json_util.default)

【讨论】:

以上是关于在python中将pymongo查询集序列化为json的主要内容,如果未能解决你的问题,请参考以下文章

在 python/pymongo 中将 bson 转换为 json

Django 将查询集序列化为 JSON 以仅使用字段信息和 id 构造 RESTful 响应

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串

在 Python 中将时间序列数据拆分为训练测试集和有效集

如何在python中将正则表达式序列化为json?

如何在 Jackson 中将对象序列化为 ObjectNode 的值?