Вы можете создать пользовательский обработчик контракта, расширив 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
- это объект, который вы хотите сериализовать.