2016-11-07 506 views
1

如果我像這樣訪問屬性:如何知道動態對象的屬性是否存在或其值是否爲空?使用NewtonSoft

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

我2例獲得真正:

1)此屬性不會在這個充滿活力的對象存在。

2)該屬性存在,但它的價值是零

當我使用Newtonsoft庫的GetType()將返回 「JObject」 和getProperty()的 「JObject」 不工作(總是返回null) 。因此我無法使用它。

dynamicObject.GetType().GetProperty() 

如何區分兩種情況?還有其他準確的檢查我可以做嗎?

回答

0

有幾種方法可以解決這個問題;兩者都非常相似。

選項1

既然你已經知道了你的動態對象實際上是一個JObject,你可以將它轉換(或只是消除動態變量完全,直接從一開始就反序列化JSON的JObject )。從那裏,您可以使用相同的語法嘗試獲取屬性值(a JToken)。如果該屬性不存在,則結果將爲空。否則,你可以檢查令牌的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來確定屬性是否存在。如果確實如此,那麼你可以使用常規的空檢查,找出值是否爲空:

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