You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:25:32