首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JSON.NET的序列化字段的顺序

使用JSON.NET的序列化字段的顺序
EN

Stack Overflow用户
提问于 2010-07-26 05:01:21
回答 12查看 85.7K关注 0票数 155

有没有一种方法可以使用JSON.NET指定序列化JSON对象中字段的顺序

指定始终首先显示单个字段就足够了。

EN

回答 12

Stack Overflow用户

发布于 2012-07-03 18:34:58

实际上,您可以通过实现IContractResolver或覆盖DefaultContractResolverCreateProperties方法来控制顺序。

下面是我的简单IContractResolver实现的一个示例,它按字母顺序对属性进行排序:

代码语言:javascript
运行
复制
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字段将按字母顺序排列:

代码语言:javascript
运行
复制
var settings = new JsonSerializerSettings()
{
    ContractResolver = new OrderedContractResolver()
};

var json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
票数 135
EN

Stack Overflow用户

发布于 2015-02-17 15:47:45

在我的案例中,Mattias的答案不起作用。从未调用过CreateProperties方法。

在对Newtonsoft.Json内部进行了一些调试之后,我想出了另一个解决方案。

代码语言:javascript
运行
复制
public class JsonUtility
{
    public static string NormalizeJsonString(string json)
    {
        // Parse json string into JObject.
        var parsedObject = JObject.Parse(json);

        // Sort properties of JObject.
        var normalizedObject = SortPropertiesAlphabetically(parsedObject);

        // Serialize JObject .
        return JsonConvert.SerializeObject(normalizedObject);
    }

    private static JObject SortPropertiesAlphabetically(JObject original)
    {
        var result = new JObject();

        foreach (var property in original.Properties().ToList().OrderBy(p => p.Name))
        {
            var value = property.Value as JObject;

            if (value != null)
            {
                value = SortPropertiesAlphabetically(value);
                result.Add(property.Name, value);
            }
            else
            {
                result.Add(property.Name, property.Value);
            }
        }

        return result;
    }
}
票数 21
EN

Stack Overflow用户

发布于 2016-11-18 22:16:43

在我的例子中,niaher的解决方案不起作用,因为它不处理数组中的对象。

基于他的解决方案,这就是我想出来的

代码语言:javascript
运行
复制
public static class JsonUtility
{
    public static string NormalizeJsonString(string json)
    {
        JToken parsed = JToken.Parse(json);

        JToken normalized = NormalizeToken(parsed);

        return JsonConvert.SerializeObject(normalized);
    }

    private static JToken NormalizeToken(JToken token)
    {
        JObject o;
        JArray array;
        if ((o = token as JObject) != null)
        {
            List<JProperty> orderedProperties = new List<JProperty>(o.Properties());
            orderedProperties.Sort(delegate(JProperty x, JProperty y) { return x.Name.CompareTo(y.Name); });
            JObject normalized = new JObject();
            foreach (JProperty property in orderedProperties)
            {
                normalized.Add(property.Name, NormalizeToken(property.Value));
            }
            return normalized;
        }
        else if ((array = token as JArray) != null)
        {
            for (int i = 0; i < array.Count; i++)
            {
                array[i] = NormalizeToken(array[i]);
            }
            return array;
        }
        else
        {
            return token;
        }
    }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3330989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档