Я наткнулся на очень удивительное наблюдение при работе со стандартной библиотекой Python json
, а более конкретно при использовании object_pairs_hook
оттуда.
Вот мои данные:
items.json:
--
{
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
--
А вот мой минимальный рабочий код:
Jupyter QtConsole 4.3.1
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.
import json
def dummy_hook(input):
print("INPUT:",input)
filename = r'items.json'
with open(filename, 'r') as f:
data = json.load(f,object_pairs_hook=dummy_hook)
Удивительно (для меня), результат такой:
INPUT: [('value', 'New'), ('onclick', 'CreateNewDoc()')]
INPUT: [('value', 'Open'), ('onclick', 'OpenDoc()')]
INPUT: [('value', 'Close'), ('onclick', 'CloseDoc()')]
INPUT: [('menuitem', [None, None, None])]
В частности, вы поймете, что три словаря с парами "value" / "onclick" были декодированы до None
.Это проблема для меня, так как я надеялся выполнить некоторые дальнейшие операции над ними.
Вопросы: Этого и следовало ожидать?Я делаю что-то здесь неправильно?
РЕДАКТИРОВАТЬ: Таким образом, изменяя функцию ловушки на:
def dummy_hook(input):
print("INPUT:",input)
return 7
Действительно ли результат печати изменяется на:
INPUT: [('value', 'New'), ('onclick', 'CreateNewDoc()')]
INPUT: [('value', 'Open'), ('onclick', 'OpenDoc()')]
INPUT: [('value', 'Close'), ('onclick', 'CloseDoc()')]
INPUT: [('menuitem', [7,7,7])]
Как добавитьreturn
заявление меняет результат декодирования, я до сих пор не понимаю.Но да, в принципе, это решает проблему.