使用JsonConverter将JSON列表转为自定义Element结构的C#技术问题
没问题,我来帮你搞定这个ReadJson方法的实现。核心思路就是通过反射识别对应的ΞElement类,逐个解析JSON数组里的元素,封装成对应的实例后添加到列表中。
下面是填充后的完整ListConverter.ReadJson方法:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 如果传入的列表不为空,先清空原有内容 if (existingValue != null) { var list = (IList)existingValue; list.Clear(); } else { // 极端情况:如果existingValue是null,创建对应类型的空列表实例 existingValue = Activator.CreateInstance(objectType); } var listInstance = (IList)existingValue; var elementType = objectType.GetGenericArguments()[0]; if (elementType.Name.EndsWith("ΞElement")) { // 确保当前JSON token是数组开始标记 if (reader.TokenType == JsonToken.StartArray) { // 通过反射获取ΞElement类的Element属性 var elementProperty = elementType.GetProperty("Element"); if (elementProperty == null) { throw new JsonSerializationException($"类型 {elementType.Name} 未定义Element属性"); } var propertyType = elementProperty.PropertyType; // 遍历JSON数组中的每个元素 while (reader.Read()) { // 到达数组末尾时退出循环 if (reader.TokenType == JsonToken.EndArray) break; // 将当前JSON元素反序列化为Element属性对应的类型 var value = serializer.Deserialize(reader, propertyType); // 创建ΞElement实例并赋值Element属性 var elementInstance = Activator.CreateInstance(elementType); elementProperty.SetValue(elementInstance, value); // 将实例添加到列表中 listInstance.Add(elementInstance); } } // 如果JSON对应字段不是数组(比如null),保持列表为空即可 } else { // 非ΞElement类型的列表,使用Newtonsoft.Json的默认逻辑处理 serializer.Populate(reader, existingValue); } return existingValue; }
关键逻辑解释:
- 列表初始化处理:先清空传入的已有列表(你的
C类已经初始化了列表,这里避免重复数据),如果列表为null则创建新实例。 - 反射属性识别:通过反射拿到
ΞElement类的Element属性,确定它的类型(int或string),确保能正确反序列化JSON元素。 - 数组遍历与实例创建:循环读取JSON数组的每个元素,反序列化为对应属性类型后,创建
ΞElement实例并赋值,最后添加到列表中。 - 容错机制:添加了属性不存在的异常抛出,方便调试;如果JSON字段不是数组(比如null),列表会保持为空状态。
这样修改后,运行Main方法就能正确把JSON中的List_A和List_B分别转换为List<AΞElement>和List<BΞElement>了。
内容的提问来源于stack exchange,提问作者Ilan Keshet
相关产品推荐
相关产品推荐

