Как вариант, согласно документации, одним из именованных аргументов функции
json.load является
object_pairs_hook (описание по ссылке). Соответственно, можно воспользоваться собственной функцией как значением данного аргумента, типа:
def int_keys_preserve(key_val_pairs):
new_dict = {}
for key, value in key_val_pairs:
key = int(key)
new_dict[key] = value
return new_dict
>>> test = {1: '1', 2: '2', 3: '3'}
>>> js = json.dumps(test)
>>> json.loads(js)
{'1': '1', '2': '2', '3': '3'}
>>> json.loads(js, object_pairs_hook=int_keys_preserve)
{1: '1', 2: '2', 3: '3'}
P.S. Функция написана для примера по-сути и все возможные доработки (типа проверки на isdigit и обработки исключений) реализуйте уже самостоятельно под свои нужды. Ну и она, очевидно, не обработает вариант, при котором "родной" ключ будет isdigit (сконвертирует в int).