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

如何对JSON反序列化后的匿名对象通过反射获取数据?

解决方案

当你调用JsonConvert.DeserializeObject(json)而不指定泛型参数时,Newtonsoft.Json会默认将JSON反序列化为JObject类型(属于Newtonsoft.Json.Linq命名空间),这是一种动态JSON容器,它用内部字典存储键值对,而非编译时定义的.NET属性,所以反射方法(GetProperty/GetFields等)无法获取JSON中的字段。

你可以用以下两种方式直接访问数据:

方式一:转为JObject操作

using Newtonsoft.Json.Linq;

var json = "{\"message\":\"Validation failed. 1 error found.\",\"errorCode\":\"E04300\",\"developerHint\":\"Inspect validation errors and correct your request.\",\"logId\":\"7612fd90f484abda-CPH\",\"httpStatusCode\":400,\"errors\":{\"customerNumber\":{\"errors\":[{\"propertyName\":\"customerNumber\",\"errorMessage\":\"Customer number exists\",\"errorCode\":\"E06010\",\"inputValue\":29926638,\"developerHint\":\"Customer number 29926638 already exists\"}]}},\"logTime\":\"2022-10-28T12:29:27\",\"errorCount\":1}";
var jObj = JObject.Parse(json);

// 获取顶层字段
string message = (string)jObj["message"];
int httpStatusCode = (int)jObj["httpStatusCode"];

// 访问嵌套错误信息
var firstCustomerError = jObj["errors"]["customerNumber"]["errors"].FirstOrDefault();
string errorMsg = (string)firstCustomerError?["errorMessage"];
long inputValue = (long)firstCustomerError?["inputValue"];

方式二:使用dynamic动态类型

dynamic obj = JsonConvert.DeserializeObject(json);

// 直接通过属性名访问
string message = obj.message;
string errorCode = obj.errorCode;
// 访问嵌套数据
string customerErrorMsg = obj.errors.customerNumber.errors[0].errorMessage;
long inputValue = obj.errors.customerNumber.errors[0].inputValue;

这两种方式都不需要创建对应的实体类,直接就能读取JSON中的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:40:58