Saltar al contenido

Cómo comparar dos objetos Json usando C#

Nuestro team de redactores ha estado por horas buscando para dar respuesta a tu interrogante, te compartimos la respuesta por esto nuestro deseo es resultarte de mucha ayuda.

Solución:

Investigué un poco más y pude descubrir por qué el código de prueba del OP no se ejecuta como se esperaba. Pude solucionarlo instalando y usando el paquete nuget FluentAssertions.Json.

Una cosa importante:

Asegúrese de incluir using FluentAssertions.Json de lo contrario false
pueden ocurrir cosas positivas.

El código de prueba es el siguiente:

using FluentAssertions;
using FluentAssertions.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NUnit.Framework;

[TestFixture]
public class JsonTests

    [Test]
    public void JsonObject_ShouldBeEqualAsExpected()
    
        JToken expected = JToken.Parse(@" ""Name"": ""20181004164456"", ""objectId"": ""4ea9b00b-d601-44af-a990-3034af18fdb1%>"" ");
        JToken actual = JToken.Parse(@" ""Name"": ""AAAAAAAAAAAA"", ""objectId"": ""4ea9b00b-d601-44af-a990-3034af18fdb1%>"" ");

        actual.Should().BeEquivalentTo(expected);
    

Ejecutando la prueba:

Resultados de la prueba unitaria

Considere usar el JToken.DeepEquals() método proporcionado por Newtonsoft. Se vería algo así, independientemente del marco de prueba que esté usando:

Console.WriteLine(JToken.DeepEquals(InstanceObjActual, InstanceObjExpected));
// false

Hizo un método no recursivo que eliminará los gemelos: la idea es eliminar los mismos elementos de JSON muy similares, de modo que solo queden nodos diferentes en cada objeto:

public void RemoveTwins(ref BreadthFirst bf1, ref BreadthFirst bf2) 
    JsonNode traversal = bf1.Next();
    Boolean removed = false;
    do 
        if (!removed) 
            if (bf2.Current != null) while (bf1.Level == bf2.Level && bf2.Next() != null) ;
            if (bf2.Current != null) while (bf1.Level != bf2.Level && bf2.Next() != null) ;
            else bf2.Current = bf2.root;
        
        else traversal = bf1.Next();
        if (bf2.Level < 0) bf2.Current = bf2.Root;
        do 
            removed = bf1.NextAs(bf1.src, bf2, bf2.src);
            if (removed && bf1.Orphan && bf2.Orphan)  (bf1.Level == 0 && bf1.Current.NodeBelow == null)) 
                    traversal = null;
                    break;
                
             else
            if (!removed) 
                break; 
             else removed = false;
         while (removed);
        if (!removed) traversal = bf1.Next();
     while (traversal != null);

Código completo + analizador en mi GitHub (perfil o inferior).
Versión CSV anterior que también ordena la entrada mencionada en mi pregunta aquí ¿Cómo comparar JSON grandes? (el nuevo no lo hace, por lo que podría ser muy lento cuando uno de los objetos ha invertido el orden; sería más fácil ordenar durante el análisis o al menos comparar ambos vecinos de los gemelos como primer paso de búsqueda)

Si te ha sido útil este artículo, sería de mucha ayuda si lo compartieras con más programadores de esta manera nos ayudas a difundir este contenido.

¡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 *