反序列化对象类型获取值抛出空引用
Deserialized object type get value throw null reference
我有一个来自 ajax 的 json 响应,我正在尝试将其反序列化为对象类型(不是定义的模型 class)并访问其属性值。反序列化器工作正常但是当尝试获取值时我得到空引用错误。
// on break point i can clearly see the object properties and values and its not null
var tankJsonObj = JsonConvert.DeserializeObject<object>(tankJson);
//here from GetValue i get the null refernce error
var test = tankJsonObj.GetType().GetProperty("tankName").GetValue(tankJsonObj, null).ToString();
我试了测试数据
var tankJsonObj = new { tankName = "xx" };
var test = tankJsonObj.GetType().GetProperty("tankName").GetValue(tankJsonObj, null).ToString();
而且效果很好。我不明白为什么反序列化器启动的对象不是 null 在获取 属性 值时抛出错误。
第一个 GetValue()
参数需要是 tankJsonObj
因为将从该对象读取值。
更改代码:
var tankJsonObj = new { tankName = "xx" };
var test = tankJsonObj.GetType().GetProperty("tankName").GetValue(tankJsonObj, null).ToString();
Console.WriteLine(test); // "xx"
工作演示:https://dotnetfiddle.net/tOtRUf
但是当反序列化为object
时,只有object
支持的属性才会被反序列化,还有...none!因此,JSON 中的所有属性都将被忽略。
一个简单的解决方法是使用 JObject
作为目标类型(在 Newtonsoft.Json.Linq
命名空间中)。这有点像键和值的字典,并且将接受任何 属性。生成的代码非常简单,甚至不需要反射:
var tankJsonObj = JsonConvert.DeserializeObject<JObject>("{ tankName: \"xx\" }");
var test = tankJsonObj.GetValue("tankName")?.ToString();
Console.WriteLine(test); // "xx"
JsonConvert.DeserializeObject<object>
returnsa JObject
instance。 class 没有一个叫做 tankName
的 属性,所以 tankJsonObj.GetType().GetProperty("tankName")
returns null
.
当您使用匿名类型进行测试时,该类型 确实 有一个名为 tankName
的 属性。
您不需要反射来从 JObject
:
中提取值
JObject tankJsonObj = JsonConvert.DeserializeObject<JObject>(tankJson);
string tankName = tankJsonObj["tankName"]?.ToString();
我有一个来自 ajax 的 json 响应,我正在尝试将其反序列化为对象类型(不是定义的模型 class)并访问其属性值。反序列化器工作正常但是当尝试获取值时我得到空引用错误。
// on break point i can clearly see the object properties and values and its not null
var tankJsonObj = JsonConvert.DeserializeObject<object>(tankJson);
//here from GetValue i get the null refernce error
var test = tankJsonObj.GetType().GetProperty("tankName").GetValue(tankJsonObj, null).ToString();
我试了测试数据
var tankJsonObj = new { tankName = "xx" };
var test = tankJsonObj.GetType().GetProperty("tankName").GetValue(tankJsonObj, null).ToString();
而且效果很好。我不明白为什么反序列化器启动的对象不是 null 在获取 属性 值时抛出错误。
第一个 GetValue()
参数需要是 tankJsonObj
因为将从该对象读取值。
更改代码:
var tankJsonObj = new { tankName = "xx" };
var test = tankJsonObj.GetType().GetProperty("tankName").GetValue(tankJsonObj, null).ToString();
Console.WriteLine(test); // "xx"
工作演示:https://dotnetfiddle.net/tOtRUf
但是当反序列化为object
时,只有object
支持的属性才会被反序列化,还有...none!因此,JSON 中的所有属性都将被忽略。
一个简单的解决方法是使用 JObject
作为目标类型(在 Newtonsoft.Json.Linq
命名空间中)。这有点像键和值的字典,并且将接受任何 属性。生成的代码非常简单,甚至不需要反射:
var tankJsonObj = JsonConvert.DeserializeObject<JObject>("{ tankName: \"xx\" }");
var test = tankJsonObj.GetValue("tankName")?.ToString();
Console.WriteLine(test); // "xx"
JsonConvert.DeserializeObject<object>
returnsa JObject
instance。 class 没有一个叫做 tankName
的 属性,所以 tankJsonObj.GetType().GetProperty("tankName")
returns null
.
当您使用匿名类型进行测试时,该类型 确实 有一个名为 tankName
的 属性。
您不需要反射来从 JObject
:
JObject tankJsonObj = JsonConvert.DeserializeObject<JObject>(tankJson);
string tankName = tankJsonObj["tankName"]?.ToString();