• Как запретить десериализацию объекта с Json.Net?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Попробуйте 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();
      }
    
    }
    Ответ написан
    Комментировать