了解json.loads()中的object_pairs_hook

问题描述 投票:2回答:2

在这里的文档-https://docs.python.org/3/library/json.html

它说object_pairs_hook

object_pairs_hook是一个可选函数,将使用对的有序列表解码的任何对象文字的结果调用该函数。将使用object_pairs_hook的返回值代替dict。此功能可用于实现自定义解码器。如果还定义了object_hook,则object_pairs_hook优先。

this answer中有一个相当令人印象深刻的例子。

我不知道什么是“挂钩”或此功能的工作原理。该文档并没有非常清楚地解释它。我想现在写一个(否则我解析的字符串上的字符串方法会很混乱)

有人知道或不了解此功能的教程,足以详细解释其工作原理吗?他们似乎在文档中假设您知道json.loads()

黑匣子中发生的情况
python json python-3.x parsing
2个回答
3
投票

它允许您自定义JSON解析到的对象。对于此特定参数(object_pairs_hook),它是一对(读取映射对象的键/值对)。

例如,如果此字符串出现在您的JSON中:

{"var1": "val1", "var2": "val2"}

它将使用以下参数调用您指向的函数:

[('var1', 'val1'), ('var2', 'val2')]

无论函数返回什么,将在以上字符串所在的结果解析结构中使用。

一个简单的例子是object_pairs_hook=collections.OrderedDict,它可以确保您的密钥按与输入字符串中出现的密钥相同的方式进行排序。

钩子的通用思想是允许您注册给定任务所需的称为(返回)的功能。在这种特定情况下,它允许您自定义传入JSON字符串(中不同类型的对象)的解码。


0
投票

这是我在尝试了解object_pairs_hookobject_hook之间的区别时发现的唯一好答案,因此,我在这里为可能正在寻找相同信息的其他人添加此答案。我写了一个快速测试来显示差异:

import json

def hook(x):
    print(x)

json.loads('{"foo": "bar"}', object_pairs_hook=hook)
json.loads('{"foo": "bar"}', object_hook=hook)

输出:

[('foo', 'bar')]
{'foo': 'bar'}

您可以看到,不同之处在于将数据类型推送到挂钩函数:

  • object_pairs_hook发送一个元组列表
  • [object_hook发送字典。
© www.soinside.com 2019 - 2024. All rights reserved.