插入Mongo时如何处理json中的长整数?

时间:2019-03-21 12:04:28

标签: python arrays json mongodb int

问题:

我有一个非常复杂的json,其中包含多个超出8个字节的整数值(c_time,p_time),而有些则较小(以下示例中的id)

示例结构:

        {
           "c_time": 18446744062065078000,
           "p_time": 18446744062065078000,
           "id"    : 122,
           "name"  : "example",
           ...     : ... 
           simple json structure
        }

当我想将此json插入Mongo时,iam面临以下错误。

Exception MongoDB can only handle up to 8-byte ints

我尝试过的事情

要纠正这一点,我有2个选项,一种方法是解析json并使用del c_time删除所有此类大整数。但这显然存在问题,我正在丢失有价值的信息。

第二,我想将这些大整数转换为小刺。我通过json解析并尝试将其转换为字符串,但是由于json的结构和深度复杂,很难将它们全部转换为字符串。

是否有任何简单有效的方法将给定json中的所有长整数转换为字符串,而不会造成系统重大损失。

1 个答案:

答案 0 :(得分:0)

我通过在插入时将所有int / float字段都转换为字符串来解决此问题,并在读取时再次将其转换为所有内容。这是Python中的代码:

        def serialize(data):
            if isinstance(data, types.GeneratorType):
                data = list(data)
            return convert_numeric_to_str(data)

        def deserialize(data):
            return convert_str_to_numeric(data)

def convert_numeric_to_str(d):
    cur_type = type(d)

    if cur_type == dict:
        for key, value in d.items():
            d[key] = convert_numeric_to_str(value)

    elif cur_type == list:
        for i, el in enumerate(d):
            d[i] = convert_numeric_to_str(el)

    else:
        if cur_type in [int, float]:
            d = str(d)

    return d


def convert_str_to_numeric(d):
    cur_type = type(d)

    if cur_type == dict:
        for key, value in d.items():
            d[key] = convert_str_to_numeric(value)

    elif cur_type == list:
        for i, el in enumerate(d):
            d[i] = convert_str_to_numeric(el)

    else:
        if cur_type == str:
            try:
                d = int(d)
            except ValueError:
                try:
                    d = float(d)
                except ValueError:
                    pass

    return d