1

我在测试插入 mondgodb python 对象时遇到了问题,该对象是使用默认 json 解码器 json.load(....

我有这个错误:

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

你可以做这样的事情

>>> 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 回答
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 回答