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

如何检测JSON值类型解决Newtonsoft.Json多类型字段反序列化报错

问题根源

  1. 核心报错原因:当links返回空数组时,你的转换器检测到reader.TokenType == JsonToken.StartArray后直接返回了新的Links对象,但没有消耗掉整个数组的JSON token,导致反序列化器后续读取到了错位的EndArray token,触发类型匹配异常。
  2. 隐性问题:接口返回的links对象内字段名是小写开头的previous、next,你当前代码用大写开头的Previous、Next取JObject属性,会始终拿不到有效值,只能得到空字符串。

修复后完整代码

public class LinksJsonConverter : JsonConverter
{
    public override bool CanWrite => false;

    public override bool CanConvert(Type objectType)
        => objectType == typeof(Links);

    public override object ReadJson(JsonReader reader, Type objectType, 
        object existingValue, JsonSerializer serializer)
    {
        // 处理数组类型的情况
        if (reader.TokenType == JsonToken.StartArray)
        {
            // 读取完整个数组的所有token,避免reader位置错位
            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.EndArray)
                    break;
            }
            return new Links();
        }

        // 处理对象类型的情况
        if (reader.TokenType == JsonToken.StartObject)
        {
            JObject jo = JObject.Load(reader);
            return new Links
            {
                // 匹配接口返回的小写字段名
                Previous = jo["previous"]?.ToString() ?? string.Empty,
                Next = jo["next"]?.ToString() ?? string.Empty
            };
        }

        // 其他异常情况返回空对象
        return new Links();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 保留原有写入逻辑即可
        throw new NotImplementedException();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:24:02