调用DeserializeObject <object>(...)时验证Json数据

时间:2017-02-16 20:22:11

标签: c# json json.net

我想在反序列化之后验证Json代码 例如,如果我有......

using Newtonsoft.Json;
...
public Car
{
  public int Year{ get; set; }
  public String Make{ get; set; }
}
...
JsonConvert.DeserializeObject<Car>(json)

我想验证年份是< 2017 && >=1900,(例如) 或者也许确保Make是非空字符串,(或者它是可接受的值)。

我知道我可以在反序列化之后添加Validate()类型函数,但我很好奇是否有办法与JsonConvert.DeserializeObject<Car>(json)同时执行此操作

2 个答案:

答案 0 :(得分:3)

该工作的正确工具可能是serialization callback

只需创建一个Validate方法并在其上拍一个[OnDeserialized]属性:

public Car
{
  public int Year{ get; set; }
  public String Make{ get; set; }

  [OnDeserialized]
  internal void OnDeserializedMethod(StreamingContext context)
  {
    if (Year > 2017 || Year < 1900)
      throw new InvalidOperationException("...or something else");
  }
}

答案 1 :(得分:2)

使用Setters插入。

public class Car
{
    private int _year;

    public int Year
    {
        get { return _year; }
        set
        {
            if (_year > 2017 || _year < 1900)
                throw new Exception("Illegal year");
            _year = value;
        }
    }
}

对于整个对象验证,只需在设置值时随时验证。

public class Car
{
    private int _year;
    private string _make;

    public string Make 
    {
        get { return _make; }
        set
        {
            _make = value;
            ValidateIfAllValuesSet();
        }
    }

    public int Year
    {
        get { return _year; }
        set
        {
            _year = value;
            ValidateIfAllValuesSet();
        }
    }

    private void ValidateIfAllValuesSet()
    {
        if (_year == default(int) || _make == default(string))
            return;

        if (_year > 2017 || _year < 1900)
            throw new Exception("Illegal year");
    }
}