如何不使用泛型方法将JSON反序列化为匿名类型?
直接用JsonSerializer.Deserialize反序列化到匿名类型的解决办法
之前你用自定义泛型方法实现了把带Foo、Bar字段的JSON转成只有Foo属性的匿名类型,现在想直接用官方的JsonSerializer.Deserialize搞定,核心问题是泛型参数不知道填啥——毕竟直接写typeof(model)或者model.GetType()编译器不认,这是因为泛型参数需要编译时确定的类型,而这俩都是运行时才拿到的类型。
具体代码实现
假设你的JSON长这样:
{"Foo": "testValue", "Bar": "ignoreThis"}
直接这么写就行:
using System.Text.Json; // 先定义一个匿名类型模板,给编译器提供类型参考 var fooOnlyTemplate = new { Foo = string.Empty }; // 把模板的类型传给Deserialize,编译器会自动推导泛型参数 var deserializedResult = JsonSerializer.Deserialize(jsonStr, fooOnlyTemplate.GetType()); // 用var接收的话,编译器能识别匿名类型,直接强类型访问属性 Console.WriteLine(deserializedResult.Foo); // 正常输出testValue
为啥模板能行?
匿名类型的实际类型是C#编译器在编译阶段自动生成的,用模板实例的GetType()能让编译器在编译时就确定泛型参数的具体类型,而不是等到运行时才去获取,这就符合JsonSerializer.Deserialize<T>对泛型参数的要求了。
多次复用模板的优化
如果需要反复用这个匿名类型模板,可以把它做成静态只读变量,避免重复创建实例:
private static readonly object _fooOnlyTemplate = new { Foo = string.Empty }; // 使用时直接传入模板类型 var result = JsonSerializer.Deserialize(jsonStr, _fooOnlyTemplate.GetType());
这样就不用自己写自定义泛型方法,直接用官方的JsonSerializer就能完成需求。
内容的提问来源于stack exchange,提问作者Jorgoth
相关产品推荐
相关产品推荐

