【问题标题】:How to get class properties in order of declaration when serialize序列化时如何按声明顺序获取类属性
【发布时间】:2023-03-07 05:56:01
【问题描述】:

我有一个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 中获取属性的顺序是:

有什么线索吗?

【问题讨论】:

  • 根据JSON standard一个对象是一组无序名称/值对。所以属性顺序应该无关紧要。话虽如此,如果您的接收系统无法按任何顺序处理属性,您可以使用[JsonProperty(Order=XXX)] 属性来声明您想要的顺序。
  • JSON 是一种文本格式。您的屏幕截图显示的是对象的可视化(可能是通过解析 JSON 字符串创建的)。
  • 我认为你被你的调试器欺骗了,它按名称对键进行排序。 Json.Net 似乎默认遵守声明属性的顺序。小提琴:dotnetfiddle.net/NJkOuA。无论如何,@dbc 说的是正确的;属性出现的顺序对您的代码来说并不重要。

标签: c# json.net


【解决方案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。这会将它们放在任何有序属性之前。

一个 .Net Fiddle(来自 Brian Rogers 的分支)显示了属性使用的快速示例 - https://dotnetfiddle.net/wr2KRh

【讨论】:

    【解决方案2】:

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

    顺便说一句,the same goes for .net

    【讨论】:

    • @StuartL - 你的主张有任何证据吗?
    【解决方案3】:

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

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

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

    [JsonProperty(Order = 1)]
    

    更多关于 MSDN 上的JSON Serialization

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2013-05-07
      • 2015-01-10
      • 2014-08-04
      • 2015-07-19
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多