Похоже, вам нужен пользовательский конвертер (как также упоминалось в комментариях).
public class YourCustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(double));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
try
{
return serializer.Deserialize<double>(reader);
}
catch
{
return 0d;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
Теперь вы просто украшаете свойства, для которых вы хотите, чтобы они действовали, с помощью JsonConverter
. Для вашего примера это выглядело бы так:
public class Location
{
public string Name { get; set; }
[JsonConverter(typeof(YourCustomConverter))]
public double Latitude { get; set; }
[JsonConverter(typeof(YourCustomConverter))]
public double Longitude { get; set; }
}
Теперь, если вы отправите неверные данные, десериализатор выдаст исключение, которое перехватывается пользовательским конвертером, который вместо этого возвращает 0
(или любым другимзначение, которое вы хотите, чтобы оно было).
ОБНОВЛЕНИЕ:
Отказ от ответственности: Это не проверено!
Возможно, вы могли бы сделать универсальный конвертер для обработки всехслучаи:
public class YourCustomConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(T));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
try
{
return serializer.Deserialize<T>(reader);
}
catch
{
return default(T);
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}
Вы все еще можете использовать это как атрибут [JsonConverter(typeof(YourCustomConverter<double>)]
.
Также есть возможность использовать пользовательский конвертер для всей сериализации / десериализации JSON с использованием этого кода:
services.AddMvc().AddNewtonsoftJson(options =>
{
// Configure a custom converter
options.SerializerOptions.Converters.Add(new SomeOtherCustomJsonConverter());
});
Тем не менее, это не может быть сделано в общем, поэтому вам придется написать свою собственную обработку всех возможных типов.