C#中JsonConverter处理JSON单对象与数组转换的反序列化错误排查
修复反序列化错误的解决方案
问题核心在于两层嵌套结构都存在单个对象/数组的兼容需求:你只给Response类的qualifiers属性配置了转换器,但Qualifiers类的qualifier属性同样面临单个JSON对象转List<Qualifier>的场景,这才是触发错误的根源。
步骤1:给Qualifiers类的qualifier属性添加转换器
修改Qualifiers类,为qualifier字段添加SingleOrArrayConverter<Qualifier>转换器特性:
public class Qualifier { public string key { get; set; } public string message { get; set; } } public class Qualifiers { [JsonProperty("qualifier")] [JsonConverter(typeof(SingleOrArrayConverter<Qualifier>))] // 添加此行 public List<Qualifier> qualifier { get; set; } } public class Response { [JsonProperty("qualifiers", NullValueHandling = NullValueHandling.Ignore)] [JsonConverter(typeof(SingleOrArrayConverter<Qualifiers>))] public List<Qualifiers> qualifiers { get; set; } }
步骤2:添加根对象类匹配JSON结构
你的JSON最外层是response节点,需要新增一个根类来对应整个JSON结构:
public class RootObject { public Response response { get; set; } }
步骤3:修正转换器的拼写小问题(可选但推荐)
你的SingleOrArrayConverter类中CanConvert方法的参数拼写错误(objecType → objectType),修正后更规范:
public class SingleOrArrayConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) // 修正参数名 { return (objectType == typeof(List<T>)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken token = JToken.Load(reader); if (token.Type == JTokenType.Array) { return token.ToObject<List<T>>(); } return new List<T> { token.ToObject<T>() }; } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
步骤4:正确反序列化
使用RootObject作为反序列化的目标类型:
string json = @"你的JSON字符串"; var result = JsonConvert.DeserializeObject<RootObject>(json);
这样就能同时处理以下三种场景:
qualifiers是数组、qualifier是数组qualifiers是数组、qualifier是单个对象qualifiers是单个对象、qualifier是单个对象
内容的提问来源于stack exchange,提问作者1moreLearner
相关产品推荐
相关产品推荐

