[英]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.