【问题标题】:Is there a way to control the order of properties in JSON objects?有没有办法控制 JSON 对象中属性的顺序?
【发布时间】:2016-06-22 13:28:53
【问题描述】:

我使用的是Entity Framework Core,生成的类有自己的属性,即

DataModel.Agent.cs

public partial class Agent {

    public virtual decimal Id
    {
        get;
        set;
    }

    public virtual string Name
    {
        get;
        set;
    }
}

但我需要其他属性,所以我在另一个文件中声明它们:

Agent.cs

public partial class Agent
{
    [NotMapped]
    public dynamic Custom { get; set; }
}

问题是Agent.cs是在DataModel.Agent.cs之前编译的,所以编译器生成属性的顺序是:Custom、Id、Name,生成的JSON很奇怪。

我希望它是:ID、名称、自定义。换句话说,我总是希望 DataModel 类排在第一位。

编辑:澄清一下,唯一的目标是通过始终将 Id 放在首位来使 JSON 更漂亮,这是一种非常常见的模式。这对应用程序的工作方式绝对没有影响。

有没有办法强制编译器总是先编译其中一个文件?

【问题讨论】:

  • 这是真的,不应该依赖 JSON 属性顺序。
  • Json 对象被序列化为字典。字典键没有固有顺序
  • “生成的 JSON 很奇怪”是什么意思?对象在 JSON 中被序列化为字典,并且没有固有的顺序。具有 ID、名称、自定义的字典等效于与具有相同值的另一个具有 ID、自定义、名称的字典
  • 我正在使用 ASP.Net Core,它使用 Json.Net,它使用与属性声明相同的顺序进行序列化。奇怪的意思是我总是希望 Id 成为 JSON 上的第一个字段,这是一种非常常见的方法,但它不是那样工作的。此外,它只是为了让 JSON 更漂亮,它对应用程序的工作方式完全没有影响。

标签: c# .net partial-classes


【解决方案1】:

好吧,如果使用 json.net,你真的不应该指望 JSON 属性顺序

public class Account
 {
 public string EmailAddress { get; set; }

 // appear last
 [JsonProperty(Order = 1)]
 public bool Deleted { get; set; }

 [JsonProperty(Order = 2)]
  public DateTime DeletedDate { get; set; }

  public DateTime CreatedDate { get; set; }
  public DateTime UpdatedDate { get; set; }

  // appear first
  [JsonProperty(Order = -2)]
  public string FullName { get; set; }
}

http://www.newtonsoft.com/json/help/html/JsonPropertyOrder.htm

【讨论】:

  • 不完全是我想要的,它正在订购整个文件,但它确实解决了我的问题。非常感谢!
  • 我不能 100% 确定这一点,VS 可能最终会自动重新排序它们,但尝试更改包含所有编译标签的 .csproj 文件 ItemGroup 中文件的顺序,我相信 Build 会只需按照它们所在的顺序从 csproj 中读取它们。对于 .Net 文件编译顺序与项目顺序之外的引用无关。
  • 理解这一点的关键是:“MSBuild 项目文件标准为您提供了一种用于制定构建规则的声明性语言,而不是强制性的” - 即顺序根本不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2014-01-10
  • 1970-01-01
  • 2022-01-04
  • 2021-10-23
  • 2021-11-15
  • 2020-01-29
相关资源
最近更新 更多