如何让Newtonsoft.Json反序列化时拒绝字符串型数字映射为int?
问题描述
我有一段合法的JSON载荷:
{ "s": "hfhryru567riuey4", "t": 1643184327, "b": "1c4736b4-db30-43a5-ba49-d9e5c1904c05", "p": "1-1", "a": "V" }
使用Newtonsoft.Json将其反序列化为ValidationModel类:
public class ValidationModel { [JsonRequired] [Required(AllowEmptyStrings = false)] public string s { get; set; } [JsonRequired] public int t { get; set; } [JsonRequired] public System.Guid b { get; set; } [JsonRequired] [Required(AllowEmptyStrings = false)] public string p { get; set;} [JsonRequired] [Required(AllowEmptyStrings = false)] public string a { get; set; } }
现在遇到一个问题:当传入的JSON中t字段是字符串类型时(如下所示),Newtonsoft.Json会自动把字符串转成整数完成反序列化,但我需要这种场景下直接反序列化失败,以此严格校验载荷格式的正确性。
{ "s": "hfhryru567riuey4", "t": "1643184327", "b": "1c4736b4-db30-43a5-ba49-d9e5c1904c05", "p": "1-1", "a": "V" }
解决方案
可以通过自定义JSON转换器实现严格的类型匹配校验:
步骤1:创建严格校验整数类型的转换器
编写一个自定义JsonConverter,只允许JSON中的数字类型反序列化为int,否则抛出异常:
public class StrictIntConverter : JsonConverter<int> { public override int ReadJson(JsonReader reader, Type objectType, int existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.Integer) { throw new JsonSerializationException($"字段 '{reader.Path}' 应为整数类型,实际传入的是 {reader.TokenType} 类型"); } return Convert.ToInt32(reader.Value); } public override void WriteJson(JsonWriter writer, int value, JsonSerializer serializer) { writer.WriteValue(value); } }
步骤2:将转换器应用到模型字段
在ValidationModel的t字段上添加[JsonConverter]特性,指定使用上面的转换器:
public class ValidationModel { // 其他属性保持不变 [JsonRequired] [JsonConverter(typeof(StrictIntConverter))] public int t { get; set; } }
测试效果
现在反序列化t为字符串的JSON时,会直接抛出JsonSerializationException,达到校验失败的目的。如果需要对其他数字类型(比如long、float)也做严格校验,可以参照上面的写法,创建对应的严格转换器即可。
内容的提问来源于stack exchange,提问作者penstiaGarse
相关产品推荐
相关产品推荐

