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

