簡體   English   中英

使用 Netwonsoft 庫序列化 JSON 時如何按字母順序對屬性進行排序?

[英]How to sort properties alphabetically when serializing JSON using Netwonsoft library?

使用 Netwonsoft.JSON 庫序列化對象時,可以使用JsonPropertyAttribute屬性Order指定輸出順序。 但是,我還想在默認情況下按字母順序對屬性進行排序。

您可以通過擴展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;
    }
}

為了使用自定義合同解析器,您必須創建一個自定義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是您希望序列化的對象。

您可以通過實現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();
    }
}

然后設置設置並序列化對象, JSON字段將按字母順序排列:

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

var json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);

首先,如果要對代碼中的元素進行排序,請使用Property Order Attribute 我使用這個類,它將使用該屬性順序(如果存在),然后按字母順序排序:

public static class JsonHelper
{
    public class OrderedContractResolver : DefaultContractResolver
    {
        protected override IList<JsonProperty> CreateProperties(System.Type type, MemberSerialization memberSerialization)
        {
            return base.CreateProperties(type, memberSerialization)
                .OrderBy(p => p.Order ?? int.MaxValue)  // Honour any explit ordering first
                .ThenBy(p => p.PropertyName)
                .ToList();
        }
    }

    public static string SerialiseAlphabeticaly(object obj)
    {
        return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new OrderedContractResolver() });
    }
}

用法:

string json = JsonHelper.SerialiseAlphabeticaly(myObject);

您可以定義自己的 ContractResolver:

public class CustomContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        return base.CreateProperties(type, memberSerialization).OrderBy(x=>x.PropertyName).ToList();
    }
}

使用情況:

string json = JsonConvert.SerializeObject(myClass, new JsonSerializerSettings
{
    ContractResolver = new CustomContractResolver(),
    Formatting = Formatting.Indented
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM