首页 文章

python json object_pairs_hook字典解码为None

提问于
浏览
0

在使用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

    我认为你的函数 dummy_hook 应该返回一个值 . 在你的情况下,也许是相同的输入 .

    object_pairs_hook是一个可选函数,将使用有序的对列表对解码的任何对象文字的结果进行调用 . 将使用object_pairs_hook的返回值而不是dict . 此功能可用于实现依赖于键和值对被解码的顺序的自定义解码器(例如,collections.OrderedDict()将记住插入的顺序) . 如果还定义了object_hook,则object_pairs_hook优先 .

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

相关问题