Как отсортировать свойства по алфавиту при сериализации JSON с использованием библиотеки Netwonsoft? - PullRequest
0 голосов
/ 08 июля 2019

При сериализации объектов с использованием библиотеки Netwonsoft.JSON можно указать порядок вывода, используя JsonPropertyAttribute свойство Order.Тем не менее, я хотел бы также отсортировать по алфавиту свойства по умолчанию поверх этого.

Ответы [ 3 ]

0 голосов
/ 08 июля 2019

Вы можете определить свой собственный 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
});
0 голосов
/ 08 июля 2019

Фактически вы можете управлять порядком, реализуя IContractResolver или переопределяя метод CreateProperties DefaultContractResolver.

Вот пример моей простой реализации 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);
0 голосов
/ 08 июля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...