如何将类作为泛型参数传入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
相关产品推荐
相关产品推荐

