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