gpt4 book ai didi

Python json 解析器允许重复键

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:53 25 4
gpt4 key购买 nike

我需要解析一个 json 文件,不幸的是,它不遵循原型(prototype)。我对数据有两个问题,但我已经找到了解决方法,所以我只会在最后提到它,也许有人也可以提供帮助。

所以我需要解析这样的条目:

    "Test":{
"entry":{
"Type":"Something"
},
"entry":{
"Type":"Something_Else"
}
}, ...

json 默认解析器更新字典,因此仅使用最后一个条目。我还必须以某种方式存储另一个,但我不知道该怎么做。我还必须按照它们在文件中出现的顺序将键存储在多个字典中,这就是我使用 OrderedDict 来执行此操作的原因。它工作得很好,所以如果有任何方法可以用重复的条目扩展它,我将不胜感激。

我的第二个问题是这个完全相同的 json 文件包含类似这样的条目:

         "Test":{
{
"Type":"Something"
}
}

Json.load() 函数在到达 json 文件中的该行时引发异常。我解决这个问题的唯一方法是自己手动删除内括号。

提前致谢

最佳答案

您可以使用 JSONDecoder.object_pairs_hook 自定义方式 JSONDecoder解码对象。该钩子(Hook)函数将传递一个(key, value)对列表,您通常会对这些对进行一些处理,然后将其转换为dict

但是,由于 Python 字典不允许重复的键(并且您根本无法更改它),因此您可以在 Hook 中返回未更改的对,并获取 (key, value)< 的嵌套列表 解码 JSON 时配对:

from json import JSONDecoder

def parse_object_pairs(pairs):
return pairs


data = """
{"foo": {"baz": 42}, "foo": 7}
"""

decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)
obj = decoder.decode(data)
print obj

输出:

[(u'foo', [(u'baz', 42)]), (u'foo', 7)]

如何使用此数据结构取决于您。如上所述,Python 字典不允许重复键,而且没有办法解决这个问题。您将如何根据键进行查找? dct[key] 是不明确的。

因此,您可以实现自己的逻辑来按照您期望的方式处理查找,或者实现某种避免冲突以使键唯一(如果它们不是),然后然后创建嵌套列表中的字典。

<小时/>

编辑:既然您说过要修改重复键以使其唯一,那么您的操作方法如下:

from collections import OrderedDict
from json import JSONDecoder


def make_unique(key, dct):
counter = 0
unique_key = key

while unique_key in dct:
counter += 1
unique_key = '{}_{}'.format(key, counter)
return unique_key


def parse_object_pairs(pairs):
dct = OrderedDict()
for key, value in pairs:
if key in dct:
key = make_unique(key, dct)
dct[key] = value

return dct


data = """
{"foo": {"baz": 42, "baz": 77}, "foo": 7, "foo": 23}
"""

decoder = JSONDecoder(object_pairs_hook=parse_object_pairs)
obj = decoder.decode(data)
print obj

输出:

OrderedDict([(u'foo', OrderedDict([(u'baz', 42), ('baz_1', 77)])), ('foo_1', 7), ('foo_2', 23)])

make_unique 函数负责返回无冲突 key 。在此示例中,它只是在 key 后添加 _n 后缀,其中 n 是增量计数器 - 只需根据您的需要进行调整即可。

由于 object_pairs_hook 完全按照它们在 JSON 文档中出现的顺序接收对,因此也可以使用 OrderedDict 保留该顺序,我将其包含为好吧。

关于Python json 解析器允许重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54379296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com