Python json解析器允许重复键
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python json解析器允许重复键,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2374字,纯文字阅读大概需要4分钟。
内容图文
我需要解析一个json文件,不幸的是,我不遵循原型.我有两个数据问题,但我已经找到了解决方法,所以我最后会提到它,也许有人可以帮助那里.
所以我需要解析这样的条目:
"Test":{
"entry":{
"Type":"Something"
},
"entry":{
"Type":"Something_Else"
}
}, ...
json默认解析器更新字典,因此仅使用最后一个条目.我还要以某种方式存储另一个,我不知道如何做到这一点.我还必须按照它们在文件中出现的顺序将密钥存储在几个字典中,这就是我使用OrderedDict这样做的原因.它的工作正常,所以如果有任何方法可以用重复的条目扩展它,我将不胜感激.
我的第二个问题是这个相同的json文件包含这样的条目:
"Test":{
{
"Type":"Something"
}
}
Json.load()函数在json文件中到达该行时引发异常.我解决这个问题的唯一方法是自己手动移除内部支架.
提前致谢
解决方法:
您可以使用JSONDecoder.object_pairs_hook来自定义JSONDecoder如何解码对象.这个钩子函数将传递一个(键,值)对的列表,你通常会对它们进行一些处理,然后变成一个dict.
但是,由于Python词典不允许重复键(并且您根本无法更改它),因此您可以在钩子中返回未更改的对,并在解码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函数负责返回无冲突密钥.在这个例子中,它只是用_n后缀键,其中n是增量计数器 – 只需根据您的需要进行调整.
因为object_pairs_hook完全按照它们在JSON文档中出现的顺序接收对,所以也可以通过使用OrderedDict保留该顺序,我也包括它.
内容总结
以上是互联网集市为您收集整理的Python json解析器允许重复键全部内容,希望文章能够帮你解决Python json解析器允许重复键所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。