Найти различия между двумя объектами json
Существуют ли какие-либо библиотеки в .Net, чтобы сравнивать и находить различия между двумя объектами json? Я нашел некоторые решения, доступные для JavaScript, но ничего интересного для С#. Пункт моего вопроса состоит в том, чтобы создать json с изменениями, отмеченными каким-то образом, на основе сравнения. Чтобы пользователь мог видеть, где происходят изменения.
Ответы
Ответ 1
using Microsoft.XmlDiffPatch;
using Newtonsoft.Json;
Преобразуйте каждый json в xml и используйте MS XmlDiff libary. Доступно на nuget. Различия приводятся в другом документе xml, который я пишу на консоль. Например, это подходит для модульного тестирования.
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;
}
}
Ответ 2
Я использовал разные объекты JSON, чем те, что указаны в вашем примере, но он будет корректно применяться к вашему делу.
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);
}
Ответ 3
Я думаю, что лучше всего использовать JSON.NET для создания двух объектов JSON, затем рекурсивно прокручивать дерево, сравнивая каждую node, чтобы убедиться, что он существует и равен во время вашего пути.
Ответ 4
Я думаю, что лучший способ пойти здесь - создать объекты, используя newtonsoft json. http://www.nuget.org/packages/newtonsoft.json/
Итак, у вас будет два объекта одного типа, которые вы можете легко сравнить и отметить отличия.
Ответ 5
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;
}