6

使用Json.NET将 JSON 字符串反序列化为对象时,如何要求 JSON 中存在键/属性,但允许 NULL 值?

例如:

可以说我有一个类/对象...

[DataContract]
public class Car
{
    [DataMember(IsRequired = true)]
    public string Vin {get; set;}

    [DataMember(IsRequired = true)]
    public string Color {get; set;}

    public string Description {get; ;set}
}

在上面的示例中,VIN 和 Color 是必需的,如果 JSON 字符串中缺少其中任何一个,则会引发异常。但是可以说,Description 属性在反序列化后是否具有值是可选的。换句话说,NULL 是一个有效值。有两种方法可以在 JSON 字符串中实现这一点:

1)

{
    "vin": "blahblahblah7",
    "color": "blue",
    "description":  null
}

或 2)

{
    "vin": "blahblahblah7",
    "color": "blue"
}

问题是我不想仅仅因为 JSON 字符串中遗漏了 的键/值对就假设 Description 值应该为 NULL。我希望 JSON 的发件人明确将其设置为 NULL。如果场景 #2 发生,我想检测它并以错误消息响应。那么我如何要求键/值对存在,但接受 NULL 作为值?

如果有帮助,我会尝试在ASP.NET Web API项目的上下文中解决这个问题。

4

3 回答 3

16

啊。我应该在 Json.NET 文档上多花一点时间...

答案是 的Required属性JsonPropertyAttribute,它是enum类型Newtonsoft.Json.Required

[JsonProperty(Required = Newtonsoft.Json.Required.AllowNull)]
public string Description {get; set;}
于 2013-04-30T06:01:15.927 回答
2

这里真正的问题是:为什么要强制发送方在某些值上设置 null?在构建应用程序时,您永远不能强迫用户行为,这是攻击您的应用程序的第一窗口。

总是假设用户在某些时候不会做你想做的事。如果该 JSON 来自您拥有的任何其他应用程序,只需将其发送为 null,如果它是外部应用程序或用户输入,则假设一切皆有可能。

并且 Required 并不意味着该字段在输入中是必需的,它意味着它需要一个 value。那是你的问题。

于 2013-04-30T04:15:13.633 回答
2

我认为您正在寻找 DefaultValueAttribute http://james.newtonking.com/projects/json/help/index.html?topic=html/T_Newtonsoft_Json_DefaultValueHandling.htm

于 2013-04-30T04:16:37.333 回答