当在地图中有重复的键时,python的json
模块有点规范:
import json
>>> json.loads('{"a": "First", "a": "Second"}')
{u'a': u'Second'}
我知道这种行为是在documentation:
中指定的RFC指定JSON对象中的名称应该是 唯一的,但没有指定JSON对象中重复的名称应该如何 被处理。默认情况下,此模块不会引发异常; 相反,它会忽略除给定名称的最后一个名称 - 值对之外的所有名称:
对于我当前的项目,我绝对需要确保文件中没有重复的密钥,如果是这种情况,会收到错误/异常?如何实现这一目标?
我仍然坚持使用Python 2.7,因此适用于旧版本的解决方案对我最有帮助。
答案 0 :(得分:10)
好吧,您可以尝试使用JSONDecoder
类并指定自定义object_pairs_hook
,它会在重复删除之前收到重复项。
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"}''')
答案 1 :(得分:0)
以下代码将使用具有重复键的所有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"}''')