Python json object_pairs_hook словарь расшифровывается как None - PullRequest
0 голосов
/ 10 декабря 2018

Я наткнулся на очень удивительное наблюдение при работе со стандартной библиотекой 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 заявление меняет результат декодирования, я до сих пор не понимаю.Но да, в принципе, это решает проблему.

1 Ответ

0 голосов
/ 10 декабря 2018

Я думаю, что ваша функция dummy_hook должна возвращать значение.В вашем случае, возможно, тот же самый ввод.

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

from: https://docs.python.org/3.6/library/json.html#json.load

...