В python 3.4.0, используя json.dumps()
, я бросаю мне TypeError в одном случае, но работает как шарм в другом случае (что, по-моему, эквивалентно первому).Weird TypeError от json.dumps
У меня есть dict, где ключи являются строками, а значения - числами и другими dicts (например, {'x': 1.234, 'y': -5.678, 'z': {'a': 4, 'b': 0, 'c': -6}}
).
Это не удается (StackTrace не от этого конкретного фрагмента кода, но из моего большего сценария, который я не буду вставлять здесь, но это essentialy то же самое):
>>> x = dict(foo()) # obtain the data and make a new dict of it to really be sure
>>> import json
>>> json.dumps(x)
Traceback (most recent call last):
File "/mnt/data/gandalv/progs/pycharm-3.4/helpers/pydev/pydevd.py", line 1733, in <module>
debugger.run(setup['file'], None, None)
File "/mnt/data/gandalv/progs/pycharm-3.4/helpers/pydev/pydevd.py", line 1226, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/mnt/data/gandalv/progs/pycharm-3.4/helpers/pydev/_pydev_execfile.py", line 38, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc) #execute the script
File "/mnt/data/gandalv/School/PhD/Other work/Krachy/code/recalculate.py", line 54, in <module>
ls[1] = json.dumps(f)
File "/usr/lib/python3.4/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 306 is not JSON serializable
306
является одним из значений в одном из внутренних запросов в x
. Это не всегда одно и то же число, иногда это другое число, содержащееся в dict, по-видимому, из-за неупорядоченности dict.
Однако, это работает как шарм:
>>> x = foo() # obtain the data and make a new dict of it to really be sure
>>> import ast
>>> import json
>>> x2 = ast.literal_eval(repr(x))
>>> x == x2
True
>>> json.dumps(x2)
"{...}" # the json representation of dict as it should be
Может кто-нибудь, пожалуйста, скажите мне, почему это происходит и что может быть причиной? Самая запутанная часть состоит в том, что эти два dicts (исходный и тот, который был получен путем оценки представления исходного) равны, но функция dumps()
ведет себя по-разному для каждого из них.
Вы уверены это фактическое целое число, а не какой-либо другой объект, '' '' '' '' '' '' '' '' '' '' '' '' '' ''' – jonrsharpe
JSON сообщает вам, что значение '306' - это не тип, который он поддерживает *. Тот факт, что он имеет представление, что * выглядит * как целое число, явно вводит в заблуждение здесь, потому что, если он действительно был целым числом, вы бы не получили это исключение. Можете ли вы рассказать нам, что такое 'type (the_306_value)'? –
@jonrsharpe @MartijnPieters Это 'numpy.int64', так что это и есть причина. Моя ошибка, спасибо! – zegkljan