You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:12:49