【问题标题】:How to handle long ints in json while inserting into Mongo?插入Mongodb时如何处理json中的长整数?
【发布时间】:2019-03-21 12:04:27
【问题描述】:

问题:

我有一个非常复杂的 json,它有几个超过 8 字节的整数值(c_time、p_time)和一些更小的(下面示例中的 id)

示例结构:

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

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

Exception MongoDB can only handle up to 8-byte ints

我尝试了什么:

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

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

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

【问题讨论】:

标签: python arrays json mongodb int


【解决方案1】:

我已经解决了这个问题,方法是在插入时将所有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多