在此处的文档中-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()
答案 0 :(得分:1)
它允许您自定义JSON解析到的对象。对于该特定参数(object_pairs_hook
),它是一对(读取映射对象的键/值对)。
例如,如果此字符串出现在您的JSON中:
{"var1": "val1", "var2": "val2"}
它将使用以下参数调用您指向的函数:
[('var1', 'val1'), ('var2', 'val2')]
该函数返回的值将用作上述字符串所在的已解析结构中的内容。
一个简单的示例是object_pairs_hook=collections.OrderedDict
,可确保按与在输入字符串中出现的键相同的方式对键进行排序。
钩子的通用思想是允许您注册给定任务所需的称为(返回)的功能。在这种特定情况下,它允许您自定义传入JSON字符串(不同类型的对象)的解码。
答案 1 :(得分:1)
这是我在尝试了解object_pairs_hook
与object_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
发送字典。