【问题标题】:Only Ignore nulls on deserialization in Json.Net仅在 Json.Net 中忽略反序列化的空值
【发布时间】:2016-08-31 14:21:48
【问题描述】:

当我有以下模型时:

public class Customer
{
    public Customer()
    {
        FirstName = string.Empty;
        LastName = string.Empty;
    }

    [JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
    public string FirstName {get;set;}

    [JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
    public string LastName {get;set;}
}

这在我发布数据时非常有用:

// {
//    firstName: null,
//    lastName: null
// }

public int Post([FromBody]Customer customer)
{
    var firstName = customer.FirstName; //  <-- value is ""
}

这样做的问题是,如果开发者忘记在这个系统中初始化数据,那么响应结构就会将其遗漏:

public Customer
{
    FirstName = "";
}

// {
//    firstName: ''
// }

基本上,我不希望这些值为空,但我也不希望用户在请求中添加可选参数。我不能使用[Require],因为它不满足第二部分。

现在如何设置它是开发人员的责任来初始化属性,否则它将被省略。有没有办法做到这一点,让它只忽略反序列化而不是序列化?

【问题讨论】:

  • 如果你改用Include会发生什么?文档指出,如果它为 null 并且使用了 Ignore,它将在反序列化时将其排除:newtonsoft.com/json/help/html/…
  • @RickyHartmann 本质上,我只想将 Include 用于序列化,因此我的所有属性都保证存在,但在反序列化时忽略,因此如果调用者将属性显式设置为 null,它不会覆盖默认值。

标签: c# serialization asp.net-web-api json.net asp.net-web-api2


【解决方案1】:

如果我可以改写您的问题,您似乎在问,我如何才能拥有一个始终具有默认非空值的类型的属性,即使在反序列化 JSON 时设置为 null 或何时在应用程序代码中未初始化? 如果这种改写是正确的,这可以由类型本身通过使用显式而不是自动属性来处理:

public class Customer
{
    string firstName = "";
    string lastName = "";

    public Customer() { }

    public string FirstName { get { return firstName; } set { firstName = value ?? ""; } }

    public string LastName { get { return lastName; } set { lastName = value ?? ""; } }
}

FirstNameLastName 现在保证为非空,无论 Customer 类是如何构造的。

【讨论】:

  • 感谢您的回答,但此解决方案仍然让开发人员有责任使用 null 合并运算符检查 null。我在想更多如果我能够在反序列化时忽略空属性,但在返回客户端的路上,对象应该看起来完整,因为所有属性都被序列化,即使它们为空,所以 json 看起来像完整的对象。
  • @TomFobear - 请说明您的要求。 1) 你想在返回的 JSON 中为你的班级看到什么——null""? 2) 对您的开发人员来说,什么程度的负担是可以接受的?让开发人员在每个属性中添加[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 比让他们在每个属性中添加?? 更麻烦或更少?
  • 我想它不是,它确实满足将属性序列化为 json 的要求。是否有一个我可以继承的属性将被反序列化器调用?
  • @TomFobear - 您是否总是希望在反序列化时忽略 null 字符串并在序列化时作为空字符串返回?还是特定于类和属性?
  • @TomFobear - 澄清一下,如果您想要一个全局解决方案,自动将 null 字符串值映射到所有字符串类型属性的空字符串值,而无需对特定类的开发人员提出任何要求,这可以是使用custom contract resolver 完成。
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2016-08-27
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多