.Net中是否有任何库可帮助比较和查找两个json对象之间的差异?我找到了一些可用于JavaScript的解决方案,但对于C#没什么有趣的.我的问题的关键是根据比较创建带有以某种方式标记的更改的json.这样用户就可以看到更改的位置.
wes*_*ton 14
using Microsoft.XmlDiffPatch;
using Newtonsoft.Json;
Run Code Online (Sandbox Code Playgroud)
将每个json转换为xml并使用MS XmlDiff库.可在nuget上使用.在我写入控制台的另一个xml doc中给出了差异.例如,这适用于单元测试.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了不同于您示例中的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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22008 次 |
| 最近记录: |