如何知道动态对象的属性是否不存在或其值是否为空?使用NewtonSoft

时间:2016-11-07 13:32:31

标签: c# .net json.net

如果我像这样访问该属性:

if (dynamicObject["propertyName"] == null)

我会在两种情况下成真:

1)此动态对象中不存在此属性。

2)此属性存在,但它的值为null

当我使用Newtonsoft库时,GetType()将返回“JObject”而“JObject”的GetProperty()不起作用(始终返回null)。因此我无法使用它。

dynamicObject.GetType().GetProperty()

如何区分这两种情况?我还能做其他准确的检查吗?

1 个答案:

答案 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() + "\".");
}

小提琴:https://dotnetfiddle.net/4Mmbak