1

デフォルトのjsonデコーダーjson.load(...を使用してWebサービスのjson応答から抽出されたmondgodb pythonオブジェクトへの挿入をテストするときに、問題が発生しました。

このエラーが発生しました:

OverflowError: BSON can only handle up to 8-byte ints

問題は、Pythonオブジェクトの一部の値が長くデコードされていることが原因で発生し、mongodbはそれらを処理できません。

どうすればこれを解決できますか、ここでアイデアはありますか?

カスタムデコーダーが頭に浮かぶので、大きな数をlongにデコードする場合は、代わりに文字列を使用します。

他の解決策は次のとおりです。いくつかの可能な長いフィールドを含むPythonオブジェクトを取得し、それらすべてを文字列に変換します。

私はpythonとjsonの経験があまりありません。どんな助けでもいただければ幸いです

4

3 に答える 3

2

私はついに問題の満足のいく解決策にたどり着きました:

`req = urllib2.Request(url)
opener = urllib2.build_opener()
file_json = opener.open(req)
json_response = json.load(file_json, parse_int=str)`

したがって、ここでの重要なポイントは次のとおりです。parse_int=strこれはすべての JSON int を文字列にデコードするため、pymongo は問題なくそれを飲み込みます。

これが誰かに役立つことを願っています。

于 2012-04-19T13:38:13.517 に答える
0

問題は、Python が json からロードした数値を int として解釈していることです。

以下を実行すると、システムの最大整数値を確認できます。

>>> import sys
>>> sys.maxint
9223372036854775807

これは 2^(64-1) であるため、python が int を 32 ビット int または long として格納する必要があると判断するタイミングを把握し、強制的に long にする必要があります。

json デコーダーで次のようにするだけです。

if abs(int(num)) > 2**31:
    long(num)

次に、保存すると長くなります。

>>> from pymongo import Connection
>>> c = Connection()
>>> collection = c['test']['test']
>>> doc = {"longnum": long(123)}
>>> doc
{'longnum': 123L}
>>> collection.insert(doc)
ObjectId('4f7f0491add3616704000000')
>>> collection.find_one()
{u'_id': ObjectId('4f7f0491add3616704000000'), u'longnum': 123L}
>>> 
于 2012-04-06T15:37:40.070 に答える
0

あなたはこのようなことをすることができます

>>> import json
>>> longhandler = lambda obj: str(obj) if isinstance(obj, long) else None
>>> data=['hello long!',100L]
>>> json.dumps(data,default=longhandler)
["hello long!","100"]
于 2012-04-06T14:21:56.957 に答える