C# JsonConvert反序列化嵌套同类型JSON报错解决方案
问题根因
反序列化失败是因为JSON中递归嵌套的Part字段格式不统一:部分层级Part是单个JSON对象,部分层级是对象数组,而定义的List<PartObj>类型仅支持反序列化数组格式,遇到单个对象时就会抛出类型匹配异常。
处理方案
通过自定义JSON转换器兼容两种格式的Part字段,无需调整业务层实体的属性设计,以Newtonsoft.Json为例实现步骤如下:
- 编写自定义列表转换器,自动识别当前JSON节点类型,单个对象自动包装为单元素集合,数组直接正常反序列化:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections.Generic; public class FlexiblePartListConverter : JsonConverter<List<PartObj>> { public override List<PartObj> ReadJson(JsonReader reader, Type objectType, List<PartObj> existingValue, bool hasExistingValue, JsonSerializer serializer) { JToken currentToken = JToken.Load(reader); return currentToken.Type switch { JTokenType.Array => currentToken.ToObject<List<PartObj>>(serializer), JTokenType.Object => new List<PartObj> { currentToken.ToObject<PartObj>(serializer) }, _ => new List<PartObj>() }; } public override void WriteJson(JsonWriter writer, List<PartObj> value, JsonSerializer serializer) { if (value?.Count == 1) { JToken.FromObject(value[0], serializer).WriteTo(writer); return; } JToken.FromObject(value ?? new List<PartObj>(), serializer).WriteTo(writer); } }
- 在
PartObj类的Part属性上标记转换器特性,指定使用自定义转换器处理该字段:
public class PartObj { public string Name { get; set; } public string Rev { get; set; } public string Title { get; set; } public string current { get; set; } [JsonConverter(typeof(FlexiblePartListConverter))] public List<PartObj> Part { get; set; } } public class Response { public PartObj Part { get; set; } } public class Root { public Response Response { get; set; } }
- 原有反序列化逻辑无需修改,直接执行即可正确解析所有层级的嵌套Part结构:
Root items = JsonConvert.DeserializeObject<Root>(jsonStr);
如果你使用的是System.Text.Json序列化库,逻辑完全一致,仅需继承
System.Text.Json.Serialization.JsonConverter<T>实现对应转换逻辑即可。
内容的提问来源于stack exchange,提问作者Myth3791
相关产品推荐
相关产品推荐

