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

如何修复.NET 7自定义JSON转换器栈溢出并实现类型验证异常自定义

修复递归调用导致的StackOverflow异常问题

你的代码出现栈溢出的核心原因是:在Read和Write方法中调用JsonSerializer.Deserialize/Serialize时,传入的options已经注册了当前的MyJsonConverter,导致序列化/反序列化过程反复调用自身,形成无限递归。

修复方案

创建一个排除当前转换器的新JsonSerializerOptions实例,用这个新实例执行序列化/反序列化操作,切断递归链:

public class MyJsonConverter : JsonConverter<object>
{
    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        try
        {
            // 创建排除当前转换器的新配置
            var newOptions = new JsonSerializerOptions(options);
            newOptions.Converters.Remove(this);
            
            return JsonSerializer.Deserialize(ref reader, typeToConvert, newOptions);
        }
        catch (JsonException ex)
        {
            throw new JsonException($"Unsupported value type for {typeToConvert.Name} field", ex);
        }
    }

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        // 同样创建排除当前转换器的新配置
        var newOptions = new JsonSerializerOptions(options);
        newOptions.Converters.Remove(this);
        
        JsonSerializer.Serialize(writer, value, value.GetType(), newOptions);
    }

    public override bool CanConvert(Type typeToConvert)
    {
        return !typeToConvert.IsInterface && !typeToConvert.IsAbstract && (typeToConvert.IsValueType ||
                                                                           typeToConvert.GetConstructor(
                                                                               Type.EmptyTypes) != null);
    }
}

关键说明

  • new JsonSerializerOptions(options)会复制原配置的所有设置(比如忽略null、日期格式等),保证序列化/反序列化行为和原配置一致。
  • newOptions.Converters.Remove(this)移除当前转换器,后续调用JsonSerializer.Deserialize/Serialize时就不会再触发当前转换器的逻辑,避免递归。
  • 异常捕获逻辑保持不变,依然会在转换失败时抛出包含自定义提示的JsonException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:22:09