web-dev-qa-db-fra.com

Trouvez les différences entre deux objets JSON

Existe-t-il des bibliothèques dans .Net permettant de comparer et de trouver les différences entre deux objets JSON? J'ai trouvé des solutions disponibles pour JavaScript, mais rien d'intéressant pour C #. Le but de ma question est de créer JSON avec des modifications marquées d’une manière ou d’une autre, sur la base de la comparaison. Pour que l'utilisateur puisse voir où se trouvent les modifications.

19
Steve Macculan
using Microsoft.XmlDiffPatch;
using Newtonsoft.Json;

Convertissez chaque fichier json en xml et utilisez la bibliothèque MS XmlDiff. Disponible sur nuget . Les différences sont indiquées dans un autre document XML que j'écris ici sur la console. Ceci est approprié pour les tests unitaires par exemple.

public bool CompareJson(string expected, string actual)
{
    var expectedDoc = JsonConvert.DeserializeXmlNode(expected, "root");
    var actualDoc = JsonConvert.DeserializeXmlNode(actual, "root");
    var diff = new XmlDiff(XmlDiffOptions.IgnoreWhitespace |
                           XmlDiffOptions.IgnoreChildOrder);
    using (var ms = new MemoryStream())
    using (var writer = new XmlTextWriter(ms, Encoding.UTF8))
    {
        var result = diff.Compare(expectedDoc, actualDoc, writer);
        if (!result)
        {
            ms.Seek(0, SeekOrigin.Begin);
            Console.WriteLine(new StreamReader(ms).ReadToEnd());
        }
        return result;
    }
}
13
weston

J'ai utilisé des objets JSON différents de ceux de votre exemple, mais cela s'appliquera correctement à votre cas.

private static string GetJsonDiff(string action, string existing, string modified, string objectType)
    {
        // convert JSON to object
        JObject xptJson = JObject.Parse(modified);
        JObject actualJson = JObject.Parse(existing);

        // read properties
        var xptProps = xptJson.Properties().ToList();
        var actProps = actualJson.Properties().ToList();

        // find differing properties
        var auditLog = (from existingProp in actProps
            from modifiedProp in xptProps
            where modifiedProp.Path.Equals(existingProp.Path)
            where !modifiedProp.Value.ToString().Equals(existingProp.Value.ToString())
            select new AuditLog
            {
                Field = existingProp.Path,
                OldValue = existingProp.Value.ToString(),
                NewValue = modifiedProp.Value.ToString(),
                Action = action, ActionBy = GetUserName(),
                ActionDate = DateTime.UtcNow.ToLongDateString(),
                ObjectType = objectType
            }).ToList();

        return JsonConvert.SerializeObject(auditLog);
    }

Je pense que votre meilleur choix est d’utiliser JSON.NET pour créer deux objets JSON, puis de faire une boucle récursive dans l’arborescence, en comparant chaque nœud pour voir s’il existe et est égal pendant que vous y allez.

3
BanksySan

Je pense que la meilleure façon d’aller ici est de créer des objets en utilisant newtonsoft json . http://www.nuget.org/packages/newtonsoft.json/

Ainsi, vous aurez deux objets du même type, que vous pourrez facilement comparer et marquer les différences.

0
Pratap Das
private IEnumerable<JProperty> JSONCompare(string expectedJSON, string actualJSON)
{
    // convert JSON to object
    JObject xptJson = JObject.Parse(expectedJSON);
    JObject actualJson = JObject.Parse(actualJSON);

    // read properties
    var xptProps = xptJson.Properties().ToList();
    var actProps = actualJson.Properties().ToList();

    // find missing properties
    var missingProps = xptProps.Where(expected => actProps.Where(actual => actual.Name == expected.Name).Count() == 0);

    return missingProps;
}
0
Victor Cánovas