Прочитайте JSON и конвертируйте ключи в int - PullRequest
0 голосов
/ 29 октября 2018

Хорошо известно, что json преобразует целочисленные ключи из dict в строку:

import json
print json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}

Какой самый чистый способ восстановить целочисленные ключи при его обратной загрузке?

d = json.loads('{"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}')
print d
# {u'1': [2.5, 2.5, 2.5], u'2': [3, 3, 3, 3]}

Я думал о:

d = {int(k): d[k] for k in d}

но есть ли более чистый способ работы со словарями с целочисленными ключами в JSON / Python, не требующий преобразования ключей a posteriori?

1 Ответ

0 голосов
/ 29 октября 2018

Используйте object_hook для определения пользовательской функции и выполнения операций:

import json

def keystoint(x):
    return {int(k): v for k, v in x.items()}

j = json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}

print(json.loads(j, object_hook=keystoint))
# {1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]}

Из документов :

object_hook - необязательная функция, которая вызывается с результат любого объекта, буквально декодированный (dict). Возвращаемое значение из object_hook будет использоваться вместо dict.


Или вы также можете использовать object_pairs_hook, который позволяет перебирать пары и сохранять вызов .items() (Спасибо @chepner):
import json

def keystoint(x):
    return {int(k): v for k, v in x}

j = json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}

print(json.loads(j, object_pairs_hook=keystoint))
# {1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]}

Из документов:

object_pairs_hook - это дополнительная функция, которая будет вызываться с результат любого литерала объекта, раскодированного упорядоченным списком пар. Возвращаемое значение object_pairs_hook будет использоваться вместо ДИКТ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...