JSON反序列化报错:无法将JSON对象转为List<T>类型求助
问题分析
嘿,我一眼就揪出问题所在了!你的反序列化失败完全是因为JSON里的Providers字段格式不统一:
- 第一个
ReviewHistory项的Providers是标准的JSON数组(用[]包裹多个对象),和你ReviewHistory类里List<Provider>的定义匹配; - 但第二个
ReviewHistory项的Providers是单个JSON对象(仅用{}包裹),Newtonsoft.Json没法把单个对象直接转换成集合类型,所以直接抛出了那个报错。
解决方案
给你两种实用的解决思路,你可以根据实际场景选:
方案1:修正JSON格式(优先推荐,如果你能控制JSON生成)
如果可以调整JSON的输出,把所有单个的Providers对象都改成数组格式——哪怕只有一个元素也用[]包起来。比如把第二个项的Providers改成:
"Providers": [ { "providerId": "1073527099", "PCP_License_No": "CDE123", "PCP_Name": "baba baba", "profDegree": "MD", "productCode": "10" } ]
这样你的现有代码不需要任何改动,就能正常完成反序列化。
方案2:修改C#模型,兼容单个对象/数组(无法修改JSON时用)
要是JSON格式没法改,我们可以给Providers属性加个自定义JSON转换器,让它既能处理数组,也能自动把单个对象包装成集合。
首先实现一个通用的转换器:
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) { var token = JToken.Load(reader); // 如果是数组,直接转成List<T> if (token.Type == JTokenType.Array) { return token.ToObject<List<T>>(); } // 如果是单个对象,包装成集合返回 return new List<T> { token.ToObject<T>() }; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
然后在ReviewHistory类的Providers属性上标记这个转换器:
public class ReviewHistory { public string reviewId { get; set; } [JsonProperty("Providers")] [JsonConverter(typeof(SingleOrArrayConverter<Provider>))] // 新增这一行 public List<Provider> Providers { get; set; } }
这样不管JSON里的Providers是单个对象还是数组,都能正确反序列化成List<Provider>了。
验证测试
修改完之后再运行你的测试方法,就能顺利把JSON转换成List<ReviewHistory>集合啦!
内容的提问来源于stack exchange,提问作者Ajit Goel
相关产品推荐
相关产品推荐

