Ответы пользователя по тегу JSON
  • Как запретить десериализацию объекта с 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();
      }
    
    }
    Ответ написан
    Комментировать
  • Как заставить Newtonsoft.Json вернуть чистый json?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Newtonsoft.Json тут не причем. Дело в запросе, со стороны клиента. Нужно указать тип содержимого application/json и передать JSON в data:
    $.ajax({
    	type: "POST",
    	url: "WebService1.asmx/VerifySignature",
    	contentType: "application/json",
    	data: JSON.stringify({ certInfo: keyInfo }), // обернуть все параметры
    	success: function (result) {
    		alert(result);
    		console.log(result);
    	}
    });
    Ответ написан
    2 комментария