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

如何将类作为泛型参数传入C# JSON反序列化方法?

这个需求完全可以实现,通过C#的泛型方法即可完成改造,改造后的代码示例如下:

版本1:方法直接返回反序列化后的目标类对象

如果你不需要保留原方法返回的JObject结果,推荐用这个版本,代码更简洁:

// 泛型参数T即为你需要反序列化的目标类
public static T ReadJsonToClass<T>(string fileName, string targetNodeKey = "2")
{
    string jsonContent;
    using (StreamReader r = new StreamReader(fileName))
    {
        jsonContent = r.ReadToEnd();
    }
    JObject parsedJObj = JObject.Parse(jsonContent);
    var targetNode = parsedJObj[targetNodeKey];
    // 这里直接用泛型T代替固定的Numbers类
    return JsonConvert.DeserializeObject<T>(targetNode.ToString());
}

调用示例:

// 反序列化为Numbers类
Numbers numbersResult = ReadJsonToClass<Numbers>("numbers.json");
// 反序列化为自定义的Student类
Student studentResult = ReadJsonToClass<Student>("student.json");

版本2:保留原方法返回JObject的需求

如果你还需要用到解析后的完整JObject,可以用元组同时返回两个结果:

public static (JObject RawJObject, T DeserializedObj) ReadJson<T>(string fileName, string targetNodeKey = "2")
{
    string jsonContent;
    using (StreamReader r = new StreamReader(fileName))
    {
        jsonContent = r.ReadToEnd();
    }
    JObject parsedJObj = JObject.Parse(jsonContent);
    var targetNode = parsedJObj[targetNodeKey];
    T deserializedObj = JsonConvert.DeserializeObject<T>(targetNode.ToString());
    return (parsedJObj, deserializedObj);
}

调用示例:

var (rawJObj, numbersResult) = ReadJson<Numbers>("numbers.json");
// 可以正常使用返回的JObject和反序列化后的对象

注意事项

  • 请保证JSON文件中targetNodeKey对应节点的结构和泛型T的属性定义匹配,否则会出现反序列化失败的问题
  • 可以根据自己的需求补充空值判断、异常捕获等逻辑,提升方法的健壮性

内容的提问来源于stack exchange,提问作者Rooter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:24:04