Python解析含重复Key的JSON:利用object_pairs_hook合并值

山间有风
山间有风
发布时间:2026-10-14 | 6人浏览过
原创

Python标准json库默认解析重复Key时会覆盖旧值,导致数据丢失。本文介绍通过json.loads的object_pairs_hook参数,自定义回调函数将相同Key的值聚合成数组,从而完整保留所有键值对信息。

Python解析重复Key JSON的问题

Python内置的json模块提供了便捷的JSON文本解析功能,但当JSON字符串中存在重复的Key时,默认解析行为会导致结果错误。例如,对于包含重复键的JSON数据,直接解析无法保留完整信息。


 {"key":"1", "key":"2", "key":"3", "key2":"4"}

使用默认方式解析后,得到的结果如下所示:


{
  "key":"3",
  "key2":"4"
}

出现该问题的原因在于,Python在解析过程中会构建一个字典对象。当读取到Key的值后,若后续遇到相同的Key,新值会覆盖原有值,最终字典中仅保留最后一个Key对应的值。

这通常不符合预期需求。一种常见的处理方式是,将具有相同Key的值合并为一个列表(数组)。例如,期望得到的结果形式如下:

利用object_pairs_hook合并值


{
  "key":["1","2","3"],
  "key2":"4"
}

要实现上述结果,Python的json模块提供了相应的机制。首先,我们需要了解解析函数loads的参数原型。


json.loads(s, encoding=None, cls=None, 
    object_hook=None, parse_float=None, 
    parse_int=None, parse_constant=None, 
    object_pairs_hook=None, **kw)

需要重点关注的是object_pairs_hook参数,该参数接受一个回调函数。在解析JSON文本时,该函数会被调用,并通过其返回值来改变最终的解析结果。为了达成前述的合并效果,我们可以定义如下hook函数:


def my_obj_pairs_hook(lst):
  result={}
  count={}
  for key,val in lst:
    if key in count:count[key]=1+count[key]
    else:count[key]=1
    if key in result:
      if count[key] > 2:
        result[key].append(val)
      else:
        result[key]=[result[key], val]
    else:
      result[key]=val
  return result

在调用解析函数时,将上述自定义函数作为参数传入,具体代码示例如下:


json.loads(data, object_pairs_hook=my_obj_pairs_hook)

执行上述代码后,即可得到将相同Key的值合并为数组的预期结果。

在此示例中,传入my_obj_pairs_hook的参数是一个元组列表,其结构大致如下:


[("key","1"),("key","2"),("key","3"),("key2","4")]

之所以参数呈现这种形式,是因为这些键值对原本用于构建字典。若Python使用默认的dict方法返回字典,必然会出现值覆盖的情况。而通过指定my_obj_pairs_hook,程序会调用该函数来生成字典结果,从而确保键值对不丢失,最终获得我们期望的数据结构。对于更复杂的JSON文本,每次解析一个字典对象时都会触发该函数,并传入相应的元组列表,其形式与示例类似。

以上关于Python解析包含重复Key的JSON的方法分享完毕,希望能为读者提供参考,并支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表