1. ホーム
  2. python

[解決済み] TypeError: ObjectId('') はJSONシリアライザブルではありません。

2022-06-09 23:34:23

質問

Pythonを使用してドキュメントに集約関数をクエリした後、MongoDBから私の応答が戻ってきました。

エラーです。

TypeError: ObjectId('51948e86c25f4b1d1c0d303c') is not JSON serializable

印刷する

{'result': [{'_id': ObjectId('51948e86c25f4b1d1c0d303c'), 'api_calls_with_key': 4, 'api_calls_per_day': 0.375, 'api_calls_total': 6, 'api_calls_without_key': 2}], 'ok': 1.0}

しかし、私が戻ろうとしたとき

TypeError: ObjectId('51948e86c25f4b1d1c0d303c') is not JSON serializable

RESTfull呼び出しです。

@appv1.route('/v1/analytics')
def get_api_analytics():
    # get handle to collections in MongoDB
    statistics = sldb.statistics

    objectid = ObjectId("51948e86c25f4b1d1c0d303c")

    analytics = statistics.aggregate([
    {'$match': {'owner': objectid}},
    {'$project': {'owner': "$owner",
    'api_calls_with_key': {'$cond': [{'$eq': ["$apikey", None]}, 0, 1]},
    'api_calls_without_key': {'$cond': [{'$ne': ["$apikey", None]}, 0, 1]}
    }},
    {'$group': {'_id': "$owner",
    'api_calls_with_key': {'$sum': "$api_calls_with_key"},
    'api_calls_without_key': {'$sum': "$api_calls_without_key"}
    }},
    {'$project': {'api_calls_with_key': "$api_calls_with_key",
    'api_calls_without_key': "$api_calls_without_key",
    'api_calls_total': {'$add': ["$api_calls_with_key", "$api_calls_without_key"]},
    'api_calls_per_day': {'$divide': [{'$add': ["$api_calls_with_key", "$api_calls_without_key"]}, {'$dayOfMonth': datetime.now()}]},
    }}
    ])


    print(analytics)

    return analytics

dbはうまく接続されており、コレクションもそこにあります。私は有効な期待される結果を返しましたが、私が返そうとすると、それは私にJsonエラーを与えます。応答をJSONに戻すにはどのようなアイデアがあります。ありがとうございます。

どのように解決するのですか?

自分自身で JSONEncoder を定義し、それを使用することです。

import json
from bson import ObjectId

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

JSONEncoder().encode(analytics)

また、以下のような使い方も可能です。

json.encode(analytics, cls=JSONEncoder)