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

如何不使用泛型方法将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:21:06