如果我像这样访问该属性:
if (dynamicObject["propertyName"] == null)
我会在两种情况下成真:
1)此动态对象中不存在此属性。
2)此属性存在,但它的值为null
当我使用Newtonsoft库时,GetType()将返回“JObject”而“JObject”的GetProperty()不起作用(始终返回null)。因此我无法使用它。
dynamicObject.GetType().GetProperty()
如何区分这两种情况?我还能做其他准确的检查吗?
答案 0 :(得分:1)
有两种方法可以解决这个问题;两者非常相似。
选项1
由于您已经知道您的动态对象实际上是JObject
,您可以将其强制转换(或者只是完全消除动态变量,并从一开始就将JSON直接反序列化为JObject
。从那里,您可以使用相同的语法来尝试获取属性值(JToken
)。如果该属性不存在,则结果为null。否则,您可以检查令牌的Type
属性,以确定它是JTokenType.Null
还是其他一些令牌类型:
JObject jo = (JObject)dynamicObject;
JToken token = jo["propertyName"];
if (token == null)
{
Console.WriteLine("property does not exist.");
}
else if (token.Type == JTokenType.Null)
{
Console.WriteLine("property exists with a value of null.");
}
else
{
Console.WriteLine("property exists with with a value of \"" + token.ToString() + "\".");
}
小提琴:https://dotnetfiddle.net/3Nrwns
选项2
如果您希望按原样使用动态对象,则需要使用object.ReferenceEquals
来确定属性是否存在。如果是,则可以使用常规空检查来确定该值是否为null:
dynamic val = dynamicObject["propertyName"];
if (object.ReferenceEquals(val, null))
{
Console.WriteLine("property does not exist.");
}
else if (val == null)
{
Console.WriteLine("property exists with a value of null.");
}
else
{
Console.WriteLine("property exists with with a value of \"" + val.ToString() + "\".");
}