Saltar al contenido

¿Cómo comparar dos objetos JSON con los mismos elementos en un orden diferente igual?

Solución:

Si desea que dos objetos con los mismos elementos pero en un orden diferente se comparen iguales, lo obvio que debe hacer es comparar copias ordenadas de ellos, por ejemplo, para los diccionarios representados por sus cadenas JSON a y b:

import json

a = json.loads("""
{
    "errors": [
        {"error": "invalid", "field": "email"},
        {"error": "required", "field": "name"}
    ],
    "success": false
}
""")

b = json.loads("""
{
    "success": false,
    "errors": [
        {"error": "required", "field": "name"},
        {"error": "invalid", "field": "email"}
    ]
}
""")
>>> sorted(a.items()) == sorted(b.items())
False

… pero eso no funciona, porque en cada caso, el "errors" elemento del dict de nivel superior es una lista con los mismos elementos en un orden diferente, y sorted() no intenta ordenar nada excepto el nivel “superior” de un iterable.

Para solucionarlo, podemos definir un ordered función que clasificará recursivamente cualquier lista que encuentre (y convertirá diccionarios en listas de (key, value) pares para que sean ordenables):

def ordered(obj):
    if isinstance(obj, dict):
        return sorted((k, ordered(v)) for k, v in obj.items())
    if isinstance(obj, list):
        return sorted(ordered(x) for x in obj)
    else:
        return obj

Si aplicamos esta función a a y b, los resultados se comparan igual:

>>> ordered(a) == ordered(b)
True

Otra forma podría ser usar json.dumps(X, sort_keys=True) opción:

import json
a, b = json.dumps(a, sort_keys=True), json.dumps(b, sort_keys=True)
a == b # a normal string comparison

Esto funciona para diccionarios y listas anidados.

Decodifíquelos y compárelos como comentario mgilson.

El orden no importa para el diccionario siempre que las claves y los valores coincidan. (El diccionario no tiene orden en Python)

>>> {'a': 1, 'b': 2} == {'b': 2, 'a': 1}
True

Pero el orden es importante en la lista; la clasificación resolverá el problema de las listas.

>>> [1, 2] == [2, 1]
False
>>> [1, 2] == sorted([2, 1])
True

>>> a="{"errors": [{"error": "invalid", "field": "email"}, {"error": "required", "field": "name"}], "success": false}"
>>> b = '{"errors": [{"error": "required", "field": "name"}, {"error": "invalid", "field": "email"}], "success": false}'
>>> a, b = json.loads(a), json.loads(b)
>>> a['errors'].sort()
>>> b['errors'].sort()
>>> a == b
True

El ejemplo anterior funcionará para JSON en la pregunta. Para una solución general, consulte la respuesta de Zero Piraeus.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *