c#使用Newtonsoft.Json反序列化时显式强制转换动态对象值
我想了解这里发生了什么。我正在用NewtonSoft.JSON反序列化JSON响应 我注意到我显式地需要强制转换这个动态类型的属性,以便对它们进行解释 例如:c#使用Newtonsoft.Json反序列化时显式强制转换动态对象值,c#,.net,json.net,C#,.net,Json.net,我想了解这里发生了什么。我正在用NewtonSoft.JSON反序列化JSON响应 我注意到我显式地需要强制转换这个动态类型的属性,以便对它们进行解释 例如: [Test] public void Test() { var a = JsonConvert.DeserializeObject<dynamic>("{ 'Amount': '123.0' }"); Assert.AreEqual((decimal?)a.Amount, 123m); //PASS
[Test]
public void Test()
{
var a = JsonConvert.DeserializeObject<dynamic>("{ 'Amount': '123.0' }");
Assert.AreEqual((decimal?)a.Amount, 123m); //PASS
Assert.AreEqual(a.Amount, 123m); //FAIL
}
[测试]
公开无效测试()
{
var a=JsonConvert.DeserializeObject(“{'Amount':'123.0'}”);
Assert.AreEqual((十进制?)a.Amount,123m);//通过
Assert.AreEqual(a.Amount,123m);//失败
}
我很想知道为什么会这样
这是使用动态对象的本质。如果没有强制转换,编译器将不知道在运行时如何比较这两个对象。相关但不完全相同:。基本上,
a.Amount
是一个JValue
,并且JValue
具有内置的动态支持,使显式强制转换到(十进制?
起作用。这是使用动态对象的本质。如果没有强制转换,编译器将不知道在运行时如何比较这两个对象。相关但不完全相同:。基本上,a.Amount
是一个JValue
并且JValue
具有内置的动态支持,可以显式转换为(十进制?
)。