Json en Python: error de recepción / comprobación de clave duplicada

El módulo json de python actúa un poco de la especificación cuando se tienen claves duplicadas en un mapa:

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

Sé que este comportamiento está especificado en la documentación :

El RFC especifica que los nombres dentro de un objeto JSON deben ser únicos, pero no especifica cómo se deben manejar los nombres repetidos en los objetos JSON. Por defecto, este módulo no genera una excepción; en su lugar, ignora todos menos el último apellido nombre par para un nombre dado:

Para mi proyecto actual, absolutamente necesito asegurarme de que no haya claves duplicadas en el archivo y recibir un error / excepción si este es el caso. ¿Cómo se puede lograr esto?

Todavía estoy atascado en Python 2.7, por lo que una solución que también funciona con versiones anteriores me ayudaría más.

Bueno, puedes intentar usar la clase JSONDecoder y especificar un object_pairs_hook personalizado, que recibirá los duplicados antes de que se deduzcan.

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

El siguiente código tomará cualquier json que tenga claves repetidas y las pondrá en una matriz. por ejemplo toma esta cadena json ” ‘{“a”: “hi”, “a”: “bye”}’ ” y da {“a”: [‘hi’, ‘bye’]} como salida

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