按字母顺序序列化JSON

本文关键字:序列化 JSON 顺序 | 更新日期: 2023-09-27 18:09:47

情况是这样的,我首先从模型的每个类的对象生成2个JSON。一个JSON来自我当前的模型版本,另一个来自它的前一个版本。我的工作是比较每个JSON,找出两个模型之间的差异。

问题是,对象的属性从一个JSON到另一个JSON的序列化顺序不同。

是否有一种方法可以将一个对象的所有属性按字母顺序序列化,这样我就可以很容易地比较两个字符串?

谢谢!

按字母顺序序列化JSON

如果你只想对两个json字符串进行一次比较网上有这个资源

http://tlrobinson.net/projects/javascript-fun/jsondiff

在Json。在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);
    }