处理具有重复键的JSON

3
如果我有带有重复键的JSON,每个重复键中的值都不同,如何在Python中提取两个值? 例如:
{ 
   'posting': {
                'content': 'stuff',
                'timestamp': '123456789'
              }
   'posting': {
                'content': 'weird stuff',
                'timestamp': '93828492'
              }
}

如果我想获取两个时间戳,我该怎么做?
我尝试过 a = json.loads(json_str) 然后使用 a['posting']['timestamp'],但这只返回一个值。

我想你可以手动解析它,但这似乎不是一个好主意。最好的选择是更改JSON,因为它是无效的。你应该使用一个列表代替。 - Cfreak
在字典中不能有重复的键。 - Balkishan Mer
为什么你有重复的键? - user2357112
1
@user2357112 我没有计划这个,是别人安排的,我必须处理它 =[ - Liondancer
3个回答

3

您不能有重复的键。您可以将对象更改为数组。

[
    {
        'content': 'stuff',
        'timestamp': '123456789'
    },
    {
        'content': 'weird stuff',
        'timestamp': '93828492'
    }
]

2

重复的键实际上会覆盖先前的条目。相反,您需要为该键维护一个数组。以下是示例JSON:

{

'posting' : [
              {
                'content': 'stuff',
                'timestamp': '123456789'
              },
              {
                'content': 'weird stuff',
                'timestamp': '93828492'
              }
            ]

现在您可以像这样访问发布键中的不同元素

json.posting [0],json.posting [1]


0

正如已经提到的:重复键是违背标准的,并且在各个系统中的结果都是未定义的,因此应避免使用重复键。

但是,如果第三方软件组件强制要求您这样做,请注意标准库中关于此主题的部分 https://docs.python.org/3/library/json.html#repeated-names-within-an-object

默认情况下,此模块不会引发异常;相反,它仅忽略给定名称的所有名称-值对,保留最后一个[...]可以使用 object_pairs_hook 参数更改此行为。

那么让我们开始吧!

import itertools, json


def duplicate_object_pairs_hook(pairs):
    def _key(pair):
        (k, v) = pair
        return k
    def gpairs():
        for (k, group) in itertools.groupby(pairs, _key):
            ll = [v for (_, v) in group]
            (v, *extra) = ll
            yield (k, ll if extra else v)
    return dict(gpairs())


badj = """{ 
   "posting": {"content": "stuff", "timestamp": "123456789"},
   "posting": {"content": "weird stuff", "timestamp": "93828492"}
}"""

data = json.loads(badj, object_pairs_hook=duplicate_object_pairs_hook)

现在data的值为

{
    'posting': [
        {'content': 'stuff', 'timestamp': '123456789'},
        {'content': 'weird stuff', 'timestamp': '93828492'},
    ],
}


请记住,此钩子将为每个解析的json节点调用,并提供解析后的键值对元组列表。默认行为应等同于给定键值元组可迭代对象的dict构造函数。
此外,我假设重复的键是相邻的,因为这是我的用例,但您可能需要在分组之前对这些键值对进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接