有一个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。
解决这个问题的最佳方法是什么?
递归迭代字典,并检查实例为64位整数,并转换?
转换为json字符串,使用正则表达式将所有大于某个阈值长度的数字转换为字符串?比方说,数字超过9个字符。
这两种方法有什么问题?
答案 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))
使用正则表达式来处理结构化响应,特别是涉及数字比较时,我的书中是一个很大的禁忌。