Come confrontare due oggetti Json usando C#

Come confrontare due oggetti Json usando C#

Ho scavato un po' di più e sono stato in grado di scoprire perché il codice di test dell'OP non funziona come previsto. Sono stato in grado di risolverlo installando e utilizzando il pacchetto nuget FluentAssertions.Json.

Una cosa importante:

Il codice del test è il seguente:

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);
    }
}

Esecuzione del test:


Prendi in considerazione l'utilizzo di JToken.DeepEquals() metodo fornito da Newtonsoft. Sembrerebbe un po' così, indipendentemente dal framework di test che stai utilizzando:

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

Realizzato un metodo non ricorsivo che rimuoverà i gemelli:l'idea è rimuovere gli stessi elementi da JSON molto simili, in modo che rimangano solo nodi diversi in ogni oggetto:

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) {
                JsonNode same = bf1.Current.Parent;
                traversal = bf1.RemoveCurrent();
                same = bf2.Current.Parent;
                bf2.RemoveCurrent();
                bf1.UpdateLevel();
                bf2.UpdateLevel();
                if (traversal == null
                || bf1.Root == null || bf2.Root == null
                || (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);
}

Codice completo + parser sul mio GitHub (profilo o inferiore).
Versione CSV precedente che ordina anche l'input menzionato nella mia domanda qui Come confrontare i grandi JSON? (quello nuovo no, quindi potrebbe essere molto lento quando uno degli oggetti ha invertito l'ordine:sarebbe più facile ordinare durante l'analisi o almeno confrontare entrambi i vicini di gemelli come primo passaggio di ricerca)