情况就是这样,我首先从模型的每个类的对象中生成 2 个 JSON。一个 JSON 来自我当前的模型版本,另一个来自它的先前版本。我的工作是比较每个 JSON 以找出 2 个模型之间的差异。
问题是,对象的属性没有按照从一个 JSON 到另一个 JSON 的相同顺序序列化。
有没有办法两个按字母顺序序列化一个具有所有属性的对象,这样我就可以轻松地比较两个字符串?
谢谢 !
情况就是这样,我首先从模型的每个类的对象中生成 2 个 JSON。一个 JSON 来自我当前的模型版本,另一个来自它的先前版本。我的工作是比较每个 JSON 以找出 2 个模型之间的差异。
问题是,对象的属性没有按照从一个 JSON 到另一个 JSON 的相同顺序序列化。
有没有办法两个按字母顺序序列化一个具有所有属性的对象,这样我就可以轻松地比较两个字符串?
谢谢 !
如果您只想对 2 个 json 字符串进行一次比较,则网络上有此资源
http://tlrobinson.net/projects/javascript-fun/jsondiff
在 Json.Net 中,JToken 上有一个 DeepEquals 可用。
var json1 = JToken.Parse(jsonString1);
var json2 = JToken.Parse(jsonString2);
var jsonEqual = JToken.DeepEquals(json1, json2);
如果您想完全按照您的要求订购序列化,请参阅这篇文章。
https://stackoverflow.com/a/11309106/1181408
更新 - 显示订单序列化工作正常。
public class OrderedContractResolver : DefaultContractResolver
{
protected override System.Collections.Generic.IList<JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
{
return base.CreateProperties(type, memberSerialization).OrderBy(p => p.PropertyName).ToList();
}
}
public class JsonSerializationTest1
{
public string Test1 { get; set; }
public string MyTest2 { get; set; }
public string Test2 { get; set; }
public string Test10 { get; set; }
}
public class JsonSerializationTest2
{
public string Test10 { get; set; }
public string Test1 { get; set; }
public string MyTest2 { get; set; }
public string Test2 { get; set; }
}
[TestMethod]
public void TestJsonOrder()
{
var test1 = new JsonSerializationTest1 { Test1 = "abc", MyTest2 = "efg", Test10 = "hij", Test2 = "zyx" };
var test2 = new JsonSerializationTest2 { Test1 = "abc", Test10 = "hij", Test2 = "zyx", MyTest2 = "efg" };
var test1Json = JsonConvert.SerializeObject(test1);
var test2Json = JsonConvert.SerializeObject(test2);
Assert.AreNotEqual(test1Json, test2Json);
var settings = new JsonSerializerSettings()
{
ContractResolver = new OrderedContractResolver()
};
var json1 = JsonConvert.SerializeObject(test1, Formatting.Indented, settings);
var json2 = JsonConvert.SerializeObject(test2, Formatting.Indented, settings);
Assert.AreEqual(json1, json2);
}