Создайте класс, полученный из JsonConverter, аналогично этому (может потребоваться дополнительная проверка в ReadJson):
public class FormattedStringToIntConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => false;
public override bool CanConvert(Type objectType) => objectType == typeof(string);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var token = JToken.Load(reader);
int.TryParse(token.ToString(), NumberStyles.AllowThousands, CultureInfo.CreateSpecificCulture("en-US"), out var value);
return value;
}
}
Теперь вы можете добавить атрибут в свойства вашей модели, где вы хотите использовать этот конвертер:
[JsonConverter(typeof(FormattedStringToIntConverter))]
Или, если вы хотите проверить все строки, вы можете изменить файл Startup.cs для включения некоторых JsonOptions:
services.AddMvc().AddJsonOptions(o => {
o.SerializerSettings.Converters.Add(new FormattedStringToIntConverter());
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Вы можете добавить дополнительную логику в CanConvert, чтобы попытаться преобразовать толькостроки, которые действительно содержат число.