Лучшая практика для преобразования 64-битных целых чисел в строку в объекте для json-кодирования?

Существует объект 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-битных идентификаторов в строки не представляется возможным, поскольку эти данные поступают из разных источников данных и хорошо воспроизводятся при использовании в сценариях python. Однако, когда он отправляется как json на Javascript frontent, он округляется из-за ограничений 64-битного Javascript Float. Было бы предпочтительнее преобразовать только целые числа в 64 бита в строки и оставить остальные числа как есть. Их роль известна, т.е. Меньшие числа служат для некоторых результатов/данных/статистики /count, и все 64-битные целые числа являются идентификаторами чего-то.

Каков наилучший способ справиться с этой проблемой?

  1. Рекурсивно перебирать словарь и проверять экземпляр на 64-битное целое число и преобразовывать?

  2. Преобразовать в строку json, использовать регулярное выражение для преобразования всех чисел, превышающих некоторую пороговую длину в строки? скажем, цифры длиной более 9 символов.

Каковы же зачатки обоих методов?

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))

Манипулирование структурированными ответами с регулярными выражениями, особенно с числовыми сравнениями, является большой проблемой, не имеющей в моей книге.

licensed under cc by-sa 3.0 with attribution.