使用 Netwonsoft.JSON 库序列化对象时,可以使用JsonPropertyAttribute
property指定输出顺序Order
。但是,我还想在默认情况下按字母顺序对属性进行排序。
6560 次
4 回答
13
您可以通过扩展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
是您希望序列化的对象。
于 2019-07-08T11:08:17.900 回答
7
您实际上可以通过实现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);
于 2019-07-08T11:13:36.510 回答
2
首先,如果要对代码中的元素进行排序,请使用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);
于 2020-07-14T13:38:19.467 回答
0
您可以定义自己的 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
});
于 2019-07-08T11:10:49.493 回答