Python中的Json:接收/检查重复密钥错误
python的Python中的Json:接收/检查重复密钥错误,python,json,Python,Json,python的json模块在映射中具有重复键时起到了一点规范作用: import json >>> json.loads('{"a": "First", "a": "Second"}') {u'a': u'Second'} 我知道该行为在以下文件中有规定: RFC指定JSON对象中的名称应为 唯一,但未指定JSON对象中重复的名称应如何显示 被处理。默认情况下,此模块不会引发异常; 相反,它会忽略给定名称的除姓氏值对以外的所有值: 对于我当前的项目,我绝对需要确保文件中没有重
json
模块在映射中具有重复键时起到了一点规范作用:
import json
>>> json.loads('{"a": "First", "a": "Second"}')
{u'a': u'Second'}
我知道该行为在以下文件中有规定:
RFC指定JSON对象中的名称应为
唯一,但未指定JSON对象中重复的名称应如何显示
被处理。默认情况下,此模块不会引发异常;
相反,它会忽略给定名称的除姓氏值对以外的所有值:
对于我当前的项目,我绝对需要确保文件中没有重复的密钥,如果是这种情况,我会收到一个错误/异常?如何做到这一点?
我仍然停留在Python 2.7上,因此一个同样适用于旧版本的解决方案对我帮助最大。好吧,您可以尝试使用该类并指定一个自定义的
对象对钩子,它将在重复数据消除之前接收重复数据
import json
def dupe_checking_hook(pairs):
result = dict()
for key,val in pairs:
if key in result:
raise KeyError("Duplicate key specified: %s" % key)
result[key] = val
return result
decoder = json.JSONDecoder(object_pairs_hook=dupe_checking_hook)
# Raises a KeyError
some_json = decoder.decode('''{"a":"hi","a":"bye"}''')
# works
some_json = decoder.decode('''{"a":"hi","b":"bye"}''')
下面的代码将获取任何具有重复键的json,并将它们放入一个数组中。例如,将此json字符串“{a”:“hi”,“a”:“bye”}”作为输出{a”:['hi','bye']}
import json
def dupe_checking_hook(pairs):
result = dict()
for key,val in pairs:
if key in result:
if(type(result[key]) == dict):
temp = []
temp.append(result[key])
temp.append(val)
result[key] = temp
else:
result[key].append(val)
else:
result[key] = val
return result
decoder = json.JSONDecoder(object_pairs_hook=dupe_checking_hook)
#it will not raise error
some_json = decoder.decode('''{"a":"hi","a":"bye"}''')
谢谢是否有可能在错误消息上生成一些上下文?例如,包含错误的映射(如果有)的名称?不容易,因为钩子只获取键值对。(您可以转储整个列表,这可能会让您很好地猜测它是基于值集合的,但也可能相当大。)请在代码中添加一些解释。以及它如何解决这个问题。谢谢