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:
- A chave "nome" foi substituída, com valor anterior "joao" e valor atual "Joao"
- A chave "cidade" foi removida
- 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.