使用Netwonsoft库序列化JSON时如何按字母顺序对属性进行排序?

时间:2019-07-08 11:01:03

标签: c# .net json serialization json.net

使用Netwonsoft.JSON库序列化对象时,可以使用JsonPropertyAttribute属性Order指定输出顺序。但是,我还希望默认情况下按字母顺序对属性进行排序。

4 个答案:

答案 0 :(得分:2)

首先,如果要对代码中的元素进行排序,请使用Property Order Attribute。我使用该类,该类将使用该属性顺序(如果存在),然后 then 按字母顺序排序:

select row_number() over (order by id) as new_id, t.*
from t
where not exists (select 1 from t t2 where t2.u = t.u and t2.c <> t.c);

用法:

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() });
    }
}

答案 1 :(得分:0)

您可以通过扩展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是您要序列化的对象。

答案 2 :(得分: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
});

答案 3 :(得分:0)

您实际上可以通过实现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);