了解json.loads()中的object_pairs_hook

时间:2019-02-04 15:46:27

标签: python json python-3.x parsing

在此处的文档中-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()

黑匣子中发生的情况

2 个答案:

答案 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_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发送字典。