Comparando Objetos JSON em Python: Métodos e Ferramentas

Método 1: Utilizando jsonpatch

1.1 Instalação

pip install jsonpatch

1.2 Utilização

import jsonpatch

origem = {'numeros': [1, 3, 4, 8], 'chave': 'valor'}
destino = {'chave': 'valor_atualizado', 'numeros': [1, 3, 8,{'b':'6'}]}
diferencas = jsonpatch.JsonPatch.from_diff(origem, destino)

print(diferencas)

Saída:

[{"op": "remove", "path": "/numeros/2"}, {"op": "add", "path": "/numeros/3", "value": {"b": "6"}}, {"op": "replace", "path": "/chave", "value": "valor_atualizado"}]

Para transformar o objeto JSON origem em destino, são necessárias três operações: remover o elemento no índice 2 da lista "numeros", adicionar um novo objeto no índice 3 da mesma lista, e substituir o valor da chave "chave".

Método 2: json_tools

O módulo json_tools é uma biblioteca Python desenvolvida para comparar dois objetos JSON. A função retorna True se os objetos forem idênticos, caso contrário, retorna uma lista contendo as diferenças.

É importante notar que quando os objetos contêm listas, a biblioteca compara elementos na mesma posição. Isso significa que duas listas com os mesmos elementos em ordens diferentes serão consideradas diferentes.

Por exemplo, se temos:

lista_a = [x, y, z, w]
lista_b = [x, z, y, w]

Embora contenham os mesmos elementos, a comparação posição por posição resultará em diferenças.

2.1 Instalação

pip install json_tools

2.2 Utilização 2.2.1 Comparação em nível único

import json_tools

dicionario1 = {'nome':'joao',"idade":'30',"cidade":"rio"}
dicionario2 = {'nome':'Joao',"idade":'30',"bairro":"copacabana'}

def comparar_json(json_original, json_modificado):
    resultado = json_tools.diff(json_original, json_modificado)
    return resultado

resultado = comparar_json(dicionario1, dicionario2)
print(resultado)

Saída:

[{'replace': '/nome', 'value': 'Joao', 'prev': 'joao'}, {'remove': '/cidade', 'prev': 'rio'}, {'add': '/bairro', 'value': 'copacabana'}]

A saída indica as alterações necessárias para transformar dicionario1 em dicionario2:

  1. A chave "nome" foi substituída, com valor anterior "joao" e valor atual "Joao"
  2. A chave "cidade" foi removida
  3. Uma nova chave "bairro" foi adiiconada com valor "copacabana"

2.2.2 Comparação com aninhamento

import json_tools

dados_originais = {"nome": "maria", "info": {"estado": "sp", "cidades": ["sao paulo", "campinas"]}}
dados_modificados = {"nome": "Maria", "info": {"estado": "sp", "municipios": ["santos", "campinas"]}}

def comparar_json(json_original, json_modificado):
    resultado = json_tools.diff(json_original, json_modificado)
    return resultado

resultado = comparar_json(dados_originais, dados_modificados)
print(resultado)

Saída:

[{'replace': '/nome', 'value': 'Maria', 'prev': 'maria'}, {'remove': '/info/cidades', 'prev': ['sao paulo', 'campinas']}, {'add': '/info/municipios', 'value': ['santos', 'campinas']}]

Método 3: Comparação Manual

Outra abordagem é converter os dados JSON em dicionários Python, ordenar as chaves de ambos os dicionários e comparar os valores correspondentes.

import json

# Carregar dados JSON para dicionários
with open('arquivo1.json') as f:
    dict1 = json.load(f)
with open('arquivo2.json') as f:
    dict2 = json.load(f)

# Comparar dicionários ordenados
for chave_origem, chave_destino in zip(sorted(dict1), sorted(dict2)):
    if str(dict1[chave_origem]) != str(dict2[chave_destino]):
        print(f"Diferença encontrada na chave: {chave_origem}")
        print(f"Valor original: {dict1[chave_origem]}")
        print(f"Valor modificado: {dict2[chave_destino]}")

Este método permite uma comparação detalhada entre dois objetos JSON, identificando todas as diferenças nos valores correspondentes após a ordenação das chaves.

Tags: Python JSON jsonpatch json_tools comparação de dados

Publicado em 8-11 07:01