7

当映射中有重复键时,python的json模块会起到一些规范的作用:

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

我知道文档中指定了这种行为:

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

对于我当前的项目,我绝对需要确保文件中不存在重复的键,如果是这种情况,我会收到错误/异常?如何实现?

我仍然坚持使用 Python 2.7,所以一个也适用于旧版本的解决方案对我帮助最大。

4

2 回答 2

12

好吧,您可以尝试使用JSONDecoder该类并指定一个 custom 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"}''')
于 2013-04-23T14:35:29.403 回答
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"}''')
于 2018-09-04T05:44:41.983 回答