使用 Netwonsoft 库序列化 JSON 时如何按字母顺序对属性进行排序?

Mic*_*smo 5 .net c# serialization json json.net

使用 Netwonsoft.JSON 库序列化对象时,可以使用JsonPropertyAttributeproperty指定输出顺序Order。但是,我还想在默认情况下按字母顺序对属性进行排序。

Mic*_*smo 11

您可以通过扩展Newtonsoft.Json.Serialization.DefaultContractResolver. 该CreateProperties方法是负责属性顺序的方法,因此覆盖它并重新排序属性会以您想要的方式改变行为:

public class OrderedContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override System.Collections.Generic.IList<Newtonsoft.Json.Serialization.JsonProperty> CreateProperties(System.Type type, Newtonsoft.Json.MemberSerialization memberSerialization)
    {
        var @base = base.CreateProperties(type, memberSerialization);
        var ordered = @base
            .OrderBy(p => p.Order ?? int.MaxValue)
            .ThenBy(p => p.PropertyName)
            .ToList();
        return ordered;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了使用自定义合同解析器,您必须创建一个自定义Newtonsoft.Json.JsonSerializerSettings并将其设置为它ContractResolver的一个实例:

var jsonSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
{
    ContractResolver = new OrderedContractResolver(),
};
Run Code Online (Sandbox Code Playgroud)

然后使用上述设置对象的实例进行序列化:

using (Newtonsoft.Json.JsonWriter writer = new Newtonsoft.Json.JsonTextWriter(sw))
{
    var serializer = Newtonsoft.Json.JsonSerializer.Create(jsonSerializerSettings);
    serializer.Serialize(writer, jsonObject);
}
Run Code Online (Sandbox Code Playgroud)

哪里sw是一个简单的字符串编写器:

var sb = new System.Text.StringBuilder();
var sw = new System.IO.StringWriter(sb);
Run Code Online (Sandbox Code Playgroud)

并且jsonObject是您希望序列化的对象。


Far*_*ani 8

您实际上可以通过实现IContractResolver或覆盖 DefaultContractResolver 的CreateProperties方法来控制顺序。

这是我IContractResolver按字母顺序排列属性的简单实现示例:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后设置设置并序列化对象,JSON字段将按字母顺序排列:

var settings = new JsonSerializerSettings()
{
    ContractResolver = new OrderedContractResolver()
};

var json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
Run Code Online (Sandbox Code Playgroud)