Python中的Json:接收/检查重复键错误

时间:2013-04-23 14:29:56

标签: python json

当在地图中有重复的键时,python的json模块有点规范:

import json
>>> json.loads('{"a": "First", "a": "Second"}')
{u'a': u'Second'}

我知道这种行为是在documentation

中指定的
  

RFC指定JSON对象中的名称应该是   唯一的,但没有指定JSON对象中重复的名称应该如何   被处理。默认情况下,此模块不会引发异常;   相反,它会忽略除给定名称的最后一个名称 - 值对之外的所有名称:

对于我当前的项目,我绝对需要确保文件中没有重复的密钥,如果是这种情况,会收到错误/异常?如何实现这一目标?

我仍然坚持使用Python 2.7,因此适用于旧版本的解决方案对我最有帮助。

2 个答案:

答案 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"}''')