如何使用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
相关产品推荐
相关产品推荐

