web-dev-qa-db-ja.com

Mongodbをシリアル化するJSON

pythonパッケージpymongoを使用して、mongodbデータベースからデータを取得しています。

>>> r = collection.find()   # returns an object of class 'Cursor'

次に、リストに変換します

>>> l = list(r)             # returns a 'list' of 'dict'

print(l)が返すものは次のとおりです。

>>> [{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'_id': 1, u'name': u'name1', u'value': 11},{u'date': datetime.datetime(2013, 11, 10, 10, 45), u'_id': 2, u'name': u'name2', u'value': 22}]

次に、操作できるようにJSONに変換する必要があります。

>>> json.dumps(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.datetime(2009, 11, 12, 11, 14) is not JSON serializable

私もフォローしようとしましたhttp://api.mongodb.org/python/1.7/api/pymongo/json_util.html成功せずに:編集:リンクの最新バージョンは http://api.mongodb.org/python/current/api/bson/json_util.html です

>>> json.dumps(l, default=json_util.default)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
NameError: name 'json_util' is not defined  

注:RパッケージrPythonとその関数rPython :: python.get( "l")を使用して、正確にこの結果をRにプッシュする必要があります。

側の質問:dictリストの各フィールドの前のu(u'Date '、u'name'など)は何ですか?

18
RockScience

あなたが指摘したpymongoのドキュメントは廃止されました。バージョン1.7を使用している場合は、更新することをお勧めします。より新しいバージョンでは、これを行うことができます:

from bson.json_util import dumps

dumps(l)

http://api.mongodb.org/python/current/api/bson/json_util.html

サイドアンサーu'name'u'date'u'_id' etcは、データベース上のドキュメントのフィールドの名前です。

46
Rafa
from bson import json_util



json.dumps(result,default=json_util.default)
11
DhruvPathak

私は同じ問題に直面していました。ドキュメントを辞書に変換するコードを書きました。参照用に使用できます。 find_one()で取得したオブジェクトをdocumentToJson()メソッドに渡し、find()の結果をconvertDocumentsToJsonに渡します。 Jsonという名前にはタイプがあり、代わりにコードはjsonではなくDictに変換されます。

from bson.json_util import dumps

class UtilService:

def __init__(self):
    pass

@staticmethod
def pinCodeParser(path):
    location = {}
    f = open(path)
    for line in f:
        words = line.split()
        location[words[1]] = (words[-3],words[-2])
    return location

@staticmethod
def listHelper(str):
    s = []
    str = str.split(',')
    for e in str:
        s.append(e.replace("[","").replace("]",""))
    return s

@staticmethod
def parseList(str):
    if ',' in str:
        return UtilService.listHelper(str)
    return str

@staticmethod
def trimStr(str):
    return str.replace('"','')

@staticmethod
def documentToJson(document):
    document = eval(dumps(document))
    mp = {}
    for key, value in document.iteritems():
        if "_id" in key:
            mp["id"] = str(value["$oid"])
        else:
            mp[ UtilService.trimStr(key) ] = UtilService.parseList( value )
    return mp

@staticmethod
def convertDocumentsToJson(documents):
    result = []
    for document in documents:
        result.append(UtilService.documentToJson(document))
    return result
0
RAX