使用Json.NET进行序列化:如何要求属性不为null?

时间:2017-03-15 11:23:07

标签: c# json serialization json.net

使用Newtonsoft的Json.NET序列化程序,是否可以要求属性包含非null值并在序列化时抛出异常(如果不是这种情况)?类似的东西:

public class Foo
{
    [JsonProperty("bar", SerializationRequired = SerializationRequired.DisallowNull)]
    public string Bar { get; set; }
}

我知道可以在反序列化时使用Required的{​​{1}}属性来执行此操作,但我找不到任何关于序列化的内容。

2 个答案:

答案 0 :(得分:1)

现在可以通过将 JsonPropertyAttribute 设置为 Required.Always 来实现。

这需要 Newtonsoft 12.0.1+,在提出此问题时尚不存在。

下面的示例抛出一个 JsonSerializationException(“必需的属性 'Value' 需要一个值,但结果为空。路径 '',第 1 行,位置 16。”):

void Main()
{
    string json = @"{'Value': null }";
    Demo res = JsonConvert.DeserializeObject<Demo>(json);
}

class Demo
{
    [JsonProperty(Required = Required.Always)]
    public string Value { get; set;}
}

答案 1 :(得分:0)

Newtonsoft serialization error handling documentation之后,您可以在OnError()方法中处理null属性。我不完全确定你将作为NullValueHandling参数传递给SerializeObject()。

public class Foo
{
     [JsonProperty]
     public string Bar 
     {
         get 
         {
             if(Bar == null)
             {
                 throw new Exception("Bar is null");
             }
             return Bar;
         }
         set { Bar = value;}

     [OnError]
     internal void OnError(StreamingContext context, ErrorContext errorContext)
     {
          // specify that the error has been handled
          errorContext.Handled = true;
          // handle here, throw an exception or ...
     }
}


int main()
{
     JsonConvert.SerializeObject(new Foo(), 
                        Newtonsoft.Json.Formatting.None, 
                        new JsonSerializerSettings { 
                            NullValueHandling = NullValueHandling.Ignore
                        });
}