如何在序列化时按声明的顺序获取类属性

时间:2015-10-02 21:09:47

标签: c# json.net

我需要使用List<CampaignModel>

序列化JsonConvert.SerializeObject

一切正常,只是我得到的属性的顺序不同于类声明。

我的班级声明是:

 public class CampaignModel
    {
        public string Checked { get; set; }
        public int CampaignId { get; set; }
        public string Name { get; set; }
        public string Market { get; set; }
        public string Type { get; set; }
        public bool IsActive { get; set; }
        public bool Active { get; set; }
    }

我在json中获取属性的顺序是:

enter image description here

有任何线索吗?

3 个答案:

答案 0 :(得分:1)

不保证属性在JavaScript中具有或维护任何特定顺序。您将在C#代码中执行的操作无法更改此“限制”。

BTW,the same goes for .net

答案 1 :(得分:1)

您可以使用JsonProperty属性

[JsonProperty(Order = 1)]

文档:JsonPropertyAttribute order

因此,假设您想要的订单是代码中的订单,那么您将拥有以下内容:

public class CampaignModel
{
    [JsonProperty(Order = 1)]
    public string Checked { get; set; }
    [JsonProperty(Order = 2)]
    public int CampaignId { get; set; }
    [JsonProperty(Order = 3)]
    public string Name { get; set; }
    [JsonProperty(Order = 4)]
    public string Market { get; set; }
    [JsonProperty(Order = 5)]
    public string Type { get; set; }
    [JsonProperty(Order = 6)]
    public bool IsActive { get; set; }
    [JsonProperty(Order = 7)]
    public bool Active { get; set; }
}

在所有属性上设置顺序的原因是因为任何属性都将被赋予默认值-1。这将把它们置于任何有序的属性之前。

.NetFiddle(来自Brian Rogers),显示了使用属性的快速示例 - https://dotnetfiddle.net/wr2KRh

答案 2 :(得分:1)

您可以指定要序列化的类成员的顺序。数据排序的基本规则包括:

  • 如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终位于订单的第一位
  • 接下来依次是 的当前类型的数据成员按字母顺序设置DataMemberAttribute属性的Order属性
  • 接下来是具有DataMemberAttribute属性集的Order属性的任何数据成员。它们首先按Order属性的值排序,然后按字母顺序排序,如果某个Order值有多个成员。订单值可能会被跳过。

因此,您可以使用Order属性指定类成员的顺序:

[JsonProperty(Order = 1)]

有关MSDN上JSON Serialization的更多信息