如何检测JSON值类型解决Newtonsoft.Json多类型字段反序列化报错
问题根源
- 核心报错原因:当
links返回空数组时,你的转换器检测到reader.TokenType == JsonToken.StartArray后直接返回了新的Links对象,但没有消耗掉整个数组的JSON token,导致反序列化器后续读取到了错位的EndArraytoken,触发类型匹配异常。 - 隐性问题:接口返回的
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
相关产品推荐
相关产品推荐

