了解 json.loads() 中的 object_pairs_hook

新手上路,请多包涵

在此处的文档中 - https://docs.python.org/3/library/json.html

它说 object_pairs_hook

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

这个答案 中有一个相当令人印象深刻的例子。

我不明白什么是“挂钩”或此功能的工作原理。文档并没有真正清楚地解释它。我现在想写一个(否则我正在解析的字符串上将是一堆字符串方法)

有没有人知道关于此功能的教程或足够了解它以详细解释它是如何工作的?他们似乎在文档中假设您知道 json.loads() 的黑匣子中发生了什么

原文由 cardamom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

它允许您自定义 JSON 将解析成的对象。对于这个特定的参数( object_pairs_hook )它是对(读取映射对象的键/值对)。

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

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

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

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

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

一个简单的例子是 object_pairs_hook=collections.OrderedDict 它确保您的键的排序方式与它们在传入字符串中出现的方式相同。

钩子的一般思想是允许您注册一个函数,该函数根据给定任务的需要被调用(返回)。在这种特定情况下,它允许您自定义对传入的 JSON 字符串(不同类型的对象)的解码。

原文由 Ondrej K. 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 import json

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

输出

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

如您所见,不同之处在于推送到挂钩函数的数据类型:

  • object_pairs_hook 发送元组列表
  • object_hook 发送字典。

我想不出这有用的充分理由,但当然 文档提供了.这有助于处理加载的 JSON 中的重复名称,否则可能会在转换中丢失数据。


编辑: 一个说明性的例子

import json

data = '{"foo": "bar", "foo": "baz"}'

json.loads(data, object_hook=print)
json.loads(data, object_pairs_hook=print)

输出

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

原文由 Sam Morgan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题