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

自定义JsonConverter触发JsonException:Read too much or not enough问题解决

问题:将JSON空数组反序列化为null时的JsonException问题

场景与需求

JSON属性值存在三种情况:

  • null:{ "some_obj" : null }
  • 空数组:{ "some_obj" : [] }
  • 带属性的非空对象:{ "some_obj" : {"name" : "nick"} }

需求:将空数组转换为null。

初始实现的转换器

为满足需求,自定义了JsonConverter<T>,但当输入为空数组时会抛出JsonException:"The converter {converter} read too much or not enough",null和非空对象场景下工作正常。

初始代码:

public class MyConverter<T> : JsonConverter<T>
{
    public override T? Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options)
    {
        if(reader.TokenType == JsonTokenType.StartArray)
        {
            return default(T);
        }
        else if (reader.TokenType == JsonTokenType.StartObject)
        {
            return JsonSerializer.Deserialize<T>(ref reader, options);
        }
        else
        {
            return default(T);
        }
    }
  
    public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
        => JsonSerializer.Serialize(writer, (T?)value, options);
}

类中使用转换器的方式

public class SomeClass
{
    [JsonConverter(typeof(MyConverter<SomeObj>))]
    [JsonPropertyName("some_obj")]
    public SomeObj? SomeObj{ get; set; }
}

public class SomeObj
{
    [JsonPropertyName("name")]
    public string? Name{ get; set; }
}

解决方法(更新后的代码)

通过确保读取到JsonTokenType.EndArray再返回,解决了异常问题。修改后的Read方法:

public override T? Read(
            ref Utf8JsonReader reader,
            Type typeToConvert,
            JsonSerializerOptions options)
{
    if (reader.TokenType == JsonTokenType.StartObject)
    {
        return JsonSerializer.Deserialize<T>(ref reader, options);
    }

    if (reader.TokenType == JsonTokenType.StartArray)
    {
        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndArray)
            {
                return default(T);
            }

        }
    }
    throw new JsonException();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:46:16