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

如何使用C# System.Text.Json反序列化匿名对象并访问其属性?

问题原因

当使用System.Text.Json.JsonSerializer.Deserialize<object>(serializedModel)时,默认行为是将JSON解析为JsonElement实例,而非动态对象或与原匿名类型匹配的实例。JsonElement本身并没有Name属性,因此调用GetType().GetProperty("Name")会返回null。而Newtonsoft.Json默认会将JSON反序列化为JObject(一种动态容器),所以反射可以正常获取属性。

解决方案

要通过反射访问属性,需要让System.Text.Json将JSON反序列化为支持动态属性的类型,比如ExpandoObject,并配置对应的序列化选项:

var model = new
{
    Name = "Alexander"
};

var serializedModel = JsonSerializer.Serialize(model);

// 配置序列化选项,支持反序列化为ExpandoObject
var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true, // 可选,忽略属性大小写匹配
};
var deserializedModel = JsonSerializer.Deserialize<ExpandoObject>(serializedModel, options);

// 现在可以通过反射获取属性
var nameProperty = deserializedModel!.GetType().GetProperty("Name");
var nameValue = nameProperty?.GetValue(deserializedModel); // 结果为"Alexander"

如果必须用object类型接收反序列化结果,可以先将其转换为ExpandoObject:

object deserializedModel = JsonSerializer.Deserialize<ExpandoObject>(serializedModel, options);
var nameProperty = deserializedModel.GetType().GetProperty("Name");

这样就能满足你通过.GetType().GetProperty(...)访问属性的需求,同时使用System.Text.Json完成序列化/反序列化操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:53:09