programing

JSON 시리즈화 Mongodb

powerit 2023. 6. 22. 22:30
반응형

JSON 시리즈화 Mongodb

나는 mongodb 데이터베이스에서 데이터를 검색하기 위해 pymongo package를 사용하고 있습니다.

>>> 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 패키지 python과 그 함수 rPython::python.get("l")을 사용하여 이 결과를 R에 푸시해야 합니다.

측면 질문:딕트 목록에서 각 필드 앞의 u(u'Date', u'name' 등)는 무엇입니까?

당신이 지적한 피몬고 문서는 구식입니다.버전 1.7을 사용하는 경우 업데이트를 권장합니다.최신 버전에서는 다음 작업을 수행할 수 있습니다.

from bson.json_util import dumps

dumps(l)

https://pymongo.readthedocs.io/en/stable/api/bson/json_util.html

사이드 답변:u'name',u'date',u'_id'등은 데이터베이스에 있는 문서의 필드 이름입니다.

from bson import json_util



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

내 상황에서, 이 오류는 플라스크의 mongo DBid 객체 때문에 발생합니다. 당신이 해야 할 일은 id를 변환하는 것입니다(참고: id 변환이 필요하다면 그것도 팝할 수 있습니다). 저는 이것이 누군가에게 도움이 되기를 바라는 제 솔루션을 공유하고 있습니다.

from flask import jsonify

def get_data(self,data):
     data['_id'] = str(data['_id'])
     return data

app =  Flask(__name__)

@app.route('/')
def apimethod():
     temp = [self.get_data(i) for i in self.collection.find()]
     return jsonify(temp)

또한 피몽고의 덤프는 많은 도움이 되지 않습니다.

from bson.json_util import dumps,loads

왜냐하면 그것은 API를 만들기 위해 내 상황에서 예상되었던 dict 대신 문자열을 반환하고 있기 때문이고 만약 내가 덤프를 했다면 나는 다시 로드해야 합니다.

이 실이 도움이 되었습니다 - 감사합니다.

JSON을 JSON/Dictionary Object로 되돌리기 위한 최종 솔루션을 공유하고 싶었습니다. (예를 들어)

from bson.json_util import dumps, loads
r = collection.find()
l = list(r) # Converts object to list
d = dumps(l) # Converts to String
dict_needed = loads(d[0]) # Serializes String and creates dictionary

이제 JSON이 사전 개체에 있으며 필요에 따라 편집할 수 있습니다.

저도 같은 문제에 직면해 있었고, 문서를 사전으로 변환하는 코드를 작성했습니다.당신은 그것을 참고할 수 있습니다.find_one()에서 얻은 개체를 문서로 전달합니다.ToJson() 메서드 및 find()를 문서로 변환한 결과Json에게. 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

언급URL : https://stackoverflow.com/questions/19674311/json-serializing-mongodb

반응형