total4c
@total4c
Говнокодер

JSON ломает типы данных, как избежать?

Приветствую! При конвертации словаря в json и обратно в словарь ломаются типы данных, т.е int, float преобразуются в строки. Как можно этого избежать?
import json

test = {1: '2'}   #  (1: int, 2: str)
js = json.dumps(test) 
to_dict = json.loads(js)  #  (1: str, 2: str)
  • Вопрос задан
  • 178 просмотров
Решения вопроса 2
Stalker_RED
@Stalker_RED
В вики в первых строках написано вот что:
JSON (англ. JavaScript Object Notation, обычно произносится как /ˈdʒeɪsən/ JAY-sən [2]) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми.


То есть он текстовый. Весь. Вот совсем. И вы никак не можете этого избежать, потому что даже если у вас получится, то это будет уже не JSON, а какой-то другой формат.

Как вариант - составить какую-то схему данных, где описаны типы полей, и по этой схеме сконвертировать из строк в нужные типы.

Или отказаться от JSON, и применить другой формат, навроде BSON или аналогов.
Ответ написан
aRegius
@aRegius
Python Enthusiast
Как вариант, согласно документации, одним из именованных аргументов функции 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).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SerJook
@SerJook
кодер
Ключом в json может быть только строка. В python-е же ключом может быть любой объект.
Как возможное решение вы можете конвертировать словарь в список [(key1,value1),(key2,value2),...] и конвертировать его в json, а потом после декодирования из json конвертировать обратно в словарь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
03 апр. 2020, в 22:05
80000 руб./за проект
03 апр. 2020, в 19:50
20000 руб./за проект
03 апр. 2020, в 19:01
500 руб./за проект