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

JSON反序列化时无法将int转为string,自定义转换器不生效问题求助

问题根源

  1. 序列化库不匹配:你编写的IntToStringConverter继承自Newtonsoft.Json.JsonConverter,属于Newtonsoft.Json(Json.NET)库的API,但你代码里反序列化用的是System.Text.Json.JsonSerializer(微软官方原生序列化库),两套库的转换器特性、配置逻辑完全不互通,所以自定义转换器完全不会被触发,断点自然无法进入。
  2. 转换器逻辑错误:即便你切换为Newtonsoft.Json做序列化,你重写的ReadJson方法直接抛出NotImplementedException,自己实现的IntToString方法没有被调用,也会报错。
  3. NumberHandling配置错误:你设置的JsonNumberHandling.WriteAsString是序列化输出时将数字转为字符串,要实现反序列化时自动将JSON数字转为C# string属性,需要配置的是JsonNumberHandling.AllowReadingFromString。

解决方案

方案1:无需自定义转换器,直接调整System.Text.Json配置(最简方案)

修改你的_serializerOptions配置,调整NumberHandling参数即可实现自动将JSON数字映射到string类型属性:

_serializerOptions = new JsonSerializerOptions()
{
    PropertyNamingPolicy = null,
    // 仅反序列化需求可单独加AllowReadingFromString,同时需要序列化输出数字为字符串可保留WriteAsString
    NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString,
};

配置生效后直接去掉属性上的[JsonConverter(typeof(IntToStringConverter))]特性即可,该特性是Newtonsoft.Json的API,System.Text.Json不会识别。

方案2:自定义System.Text.Json版本转换器(适配复杂转换逻辑)

如果你有更特殊的转换规则,需要自定义转换逻辑,需要继承System.Text.Json.Serialization.JsonConverter<T>实现转换器:

using System.Text.Json;
using System.Text.Json.Serialization;

namespace CrownData.DataInteractionLayer.DanishCrown.Models
{
    public class IntToStringConverter : JsonConverter<string>
    {
        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.Null)
            {
                return null;
            }
            if (reader.TokenType == JsonTokenType.String)
            {
                return reader.GetString();
            }
            if (reader.TokenType == JsonTokenType.Number)
            {
                // 可根据数值范围替换为GetInt64、GetDecimal等方法适配场景
                return reader.GetInt32().ToString();
            }
            throw new JsonException($"解析字符串时遇到意外token类型:{reader.TokenType}");
        }

        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
        {
            // 直接输出字符串即可,需要序列化时转回数字可自行加类型判断逻辑
            writer.WriteStringValue(value);
        }
    }
}

注册转换器两种方式二选一即可:

  1. 单独给属性加特性(注意引用System.Text.Json的命名空间,不要引用Newtonsoft.Json的对应类):
    public class StemDataReadDTO
    {
        [JsonConverter(typeof(IntToStringConverter))]
        public string Hovednummer { get; set; }
        public EjerStem Ejer { get; set; }
    }
    
  2. 全局注册到序列化选项:
    _serializerOptions = new JsonSerializerOptions()
    {
        PropertyNamingPolicy = null,
        Converters = { new IntToStringConverter() }
    };
    

内容的提问来源于stack exchange,提问作者TSS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:54:03