我想在反序列化之后验证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)
同时执行此操作
答案 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");
}
}