Попробуйте
Required:
[JsonProperty(PropertyName = "start", Required = Required.Always)]
public long? start { get; set; }
Либо проверяйте значение ключевого поля (или полей), если значение
null, считайте что десериализация не дала результатов (
outRequest = null).
Ключевое поле - это поле, которое присутствует всегда и не может иметь значение
null.
Если зацепиться не за что, то можно и по всем пройтись:
if (!outRequest.start.HasValue && !outRequest.finish.HasValue && !outRequest.template.HasValue)
{
outRequest = null;
}
По идее, если у ключевых полей использовать тип отличный от
Nullable (например,
long вместо long?), либо совместно с атрибутом
Required.Always, то при десериализации должно выбрасываться исключение, если нужные поля в данных не будут найдены. Исключение можно перехватывать (
try-catch) и таким образом понять, что входящие данные неверные.
Еще можно сделать пользовательский конвертер -
JsonConverter, но это может быть сложным решением, в плане «энергозатрат» :-)
[JsonConverter(typeof(ORequestConverter))]
public sealed class ORequest
{
[JsonProperty("start")]
public long? start { get; set; }
[JsonProperty("finish")]
public long? finish { get; set; }
[JsonProperty("template")]
public int? template { get; set; }
}
public class ORequestConverter : JsonConverter
{
public override bool CanWrite
{
get
{
return false;
}
}
public override object ReadJson
(
JsonReader reader,
Type objectType,
object existingValue, JsonSerializer serializer
)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var target = (ORequest)Activator.CreateInstance(objectType);
serializer.Populate(reader, target);
if (!target.start.HasValue && !target.finish.HasValue && !target.template.HasValue)
{
// необходимые поля не найдены или имеют значение null
// возвращаем null
return null;
}
return target;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}