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

标签 c# .net json serialization json.net

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

最佳答案

您可以通过扩展 Newtonsoft.Json.Serialization.DefaultContractResolver 创建自定义契约(Contract)解析器。 . 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;
    }
}

为了使用自定义契约(Contract)解析器,您必须创建一个自定义 Newtonsoft.Json.JsonSerializerSettings并设置其 ContractResolver到它的一个实例:
var jsonSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
{
    ContractResolver = new OrderedContractResolver(),
};

然后使用上述设置对象的实例进行序列化:
using (Newtonsoft.Json.JsonWriter writer = new Newtonsoft.Json.JsonTextWriter(sw))
{
    var serializer = Newtonsoft.Json.JsonSerializer.Create(jsonSerializerSettings);
    serializer.Serialize(writer, jsonObject);
}

哪里sw是一个简单的字符串编写器:
var sb = new System.Text.StringBuilder();
var sw = new System.IO.StringWriter(sb);

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

关于c# - 使用 Netwonsoft 库序列化 JSON 时如何按字母顺序对属性进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933494/

相关文章:

c# - Entity Framework 覆盖标识列

c# - 解码 Azure 移动服务 JWT token 时出现 JwtSecurityToken 异常

c# - 多线程与顺序处理的效果如何?

.net - 你能用 SlowCheetah 添加其他配置吗

node.js - SQLite3 Node.js JSON

c# - 10秒后出现未处理的异常错误,为什么?

c# - 如何验证下拉列表项是否已被选择

.net - 跟踪 Windows API 调用

javascript - 使用 for 循环迭代项目以更改弹出窗口的文本

javascript - 如何将此字符串转换为 JSON 对象?