将64位整数转换为json编码对象中的字符串的最佳做法?

时间:2013-11-25 10:39:18

标签: javascript python

有一个python对象包含一些数字,其中很少可能是64位整数。

my_page_obj = {'id': 7810094555612199019 ,
                'page':944,
                'blog_data':{'edited':True,
                             'edit_ids':[7810094555612199019,
                                         8810094555612199019 ,
                                         3407830461687591912 ] ,
                 'user':{ 'name':'Van Dam',
                          'split_angle':180 ,
                          'age':44 ,
                          'follows':[5082331655205093463,
                                     492349326714935674,
                                     7116718677923950629]
                  } }

将64位id转换为字符串是不可行的,因为这些数据来自各种数据源,并且在python脚本中使用时效果很好。但是,当作为json发送到Javascript frontent时,由于64位Javascript Float的限制,它会被舍入。最好只将64位整数转换为字符串,并保留其他数字。他们的角色是已知的,即较小的数字提供一些结果/数据/统计/计数,并且所有64位整数都是某事物的id。

解决这个问题的最佳方法是什么?

  1. 递归迭代字典,并检查实例为64位整数,并转换?

  2. 转换为json字符串,使用正则表达式将所有大于某个阈值长度的数字转换为字符串?比方说,数字超过9个字符。

  3. 这两种方法有什么问题?

1 个答案:

答案 0 :(得分:1)

我会选择第一个选项:

def i64str(obj):
    if isinstance(obj, list):
        return [i64str(x) for x in obj]
    if isinstance(obj, dict):
        return {k:i64str(v) for k, v in obj.items()}
    if isinstance(obj, (int, long)) and obj >= 2**32:
        return str(obj)
    return obj

json.dumps(i64str(my_page_obj))

使用正则表达式来处理结构化响应,特别是涉及数字比较时,我的书中是一个很大的禁忌。