將mongoDB數據轉化爲json---Python實現

前提背景

我們知道,mongoDB數據庫表中的一條數據(document)在呈現的時候,很像json。在平時的使用中,有時候會有這樣的需求:我們需要將數據庫中的數據讀出來,並將其傳送(例如ajax請求)到前端頁面去解析呈現。顯然此時,爲了更容易解析,我們需要將數據轉爲爲json形式。

mongoengine作爲一個操作mongoDB數據庫的python解析庫,其在將表中的數據轉化爲json形式時,雖然有to_json方法,但是轉化的json數據是不完全,冗餘的,包括“id”值多層嵌套,以及datetime類型的時間比標準時間多8個小時等(這是在我做的時候遇到的一個坑,因爲插入到mongoDB中的date爲ISODate類型的)。總之是有多種問題。因此,只能自己找方法來解決。

問題解決

通過看網上Stack Overflow的各種問題,大多數都是自己寫json轉化代碼來實現的。這裏我也是一樣,通過查閱文檔,mongoengine有一個to_mongo方法,可以將mongoDB的數據(document)轉化爲SON類型的數據。關於SON類型,看官方的解釋

SON data.
A subclass of dict that maintains ordering of keys and provides a
few extra niceties for dealing with SON. SON provides an API
similar to collections.OrderedDict from Python 2.7+.

它是Python中”字典“的一個子類,也就是說它具備字典的特性了。這裏發現一個坑,若是直接遍歷SON類型數據當數據庫的文檔中有嵌入文檔時,嵌入文檔的字段是取不到的,這裏我採取先轉化爲字典,再去遍歷。具體代碼如下:

import datetime
import json

from mongoengine.base import BaseDocument

# 使json能夠轉化datetime對象
class DateEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, datetime.date):
            return obj.strftime("%Y-%m-%d")
        else:
            return json.JSONEncoder.default(self, obj)


# 將 MongoDB 的 document轉化爲json形式
def convertMongoToJson(o):
    def convert(dic_data):
        # 對於引用的Id和該條數據的Id,這裏都是ObjectId類型的
        from bson import ObjectId
        # 字典遍歷
        for key, value in dic_data.items():
            # 如果是列表,則遞歸將值清洗
            if isinstance(value, list):
                for l in value:
                    convert(l)
            else:
                if isinstance(value, ObjectId):
                    dic_data[key] = str(dic_data.pop(key))
        return dic_data

    ret = {}
    # 判斷其是否爲Document
    if isinstance(o, BaseDocument):
        """
        轉化爲son形式,son的說明,摘自官方
        SON data.
        A subclass of dict that maintains ordering of keys and provides a
        few extra niceties for dealing with SON. SON provides an API
        similar to collections.OrderedDict from Python 2.7+.
        """
        data = o.to_mongo()
        # 轉化爲字典
        data = data.to_dict()
        ret = convert(data)
    # 將數據轉化爲json格式, 因json不能直接處理datetime類型的數據,故需要區分處理
    ret = json.dumps(ret, cls=DateEncoder)
    return ret

若有任何問題,可一起討論哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章