Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Json:接收/检查重复密钥错误_Python_Json - Fatal编程技术网

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

Python中的Json:接收/检查重复密钥错误,python,json,Python,Json,python的json模块在映射中具有重复键时起到了一点规范作用: import json >>> json.loads('{"a": "First", "a": "Second"}') {u'a': u'Second'} 我知道该行为在以下文件中有规定: RFC指定JSON对象中的名称应为 唯一,但未指定JSON对象中重复的名称应如何显示 被处理。默认情况下,此模块不会引发异常; 相反,它会忽略给定名称的除姓氏值对以外的所有值: 对于我当前的项目,我绝对需要确保文件中没有重

python的
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"}''')

谢谢是否有可能在错误消息上生成一些上下文?例如,包含错误的映射(如果有)的名称?不容易,因为钩子只获取键值对。(您可以转储整个列表,这可能会让您很好地猜测它是基于值集合的,但也可能相当大。)请在代码中添加一些解释。以及它如何解决这个问题。谢谢