.Net 中是否有任何库可以帮助比较和查找两个 json 对象之间的差异?我找到了一些适用于 JavaScript 的解决方案,但对 C# 没有什么有趣的。我的问题的重点是根据比较创建带有以某种方式标记的更改的 json。这样用户就可以看到更改在哪里。
问问题
30591 次
5 回答
14
using Microsoft.XmlDiffPatch;
using Newtonsoft.Json;
将每个 json 转换为 xml 并使用 MS XmlDiff 库。在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;
}
}
于 2014-02-05T15:31:43.990 回答
7
我使用的 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);
}
于 2016-02-10T10:23:09.417 回答
3
我认为你最好的选择是使用JSON.NET创建两个 JSON 对象,然后递归地遍历树,比较每个节点以查看它是否存在并且在你去的时候是否相等。
于 2013-10-29T19:19:24.660 回答
-1
我认为最好的方法是使用 newtonsoft json 创建对象。http://www.nuget.org/packages/newtonsoft.json/
因此,您将拥有两个相同类型的对象,您可以轻松比较并标记差异。
于 2013-10-29T19:23:12.893 回答
-1
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;
}
于 2016-11-17T10:55:05.213 回答