前言:咱們有時常會用到JObject對象接受數據,並經過JObject快速獲取指定key的值,順序的話是沒有問題的,可是假如你遇到以下的JObject對象,該怎麼快速獲取數據呢?spa
{ "details": { "threeds2.fingerprint": "123" }, "paymentData": "456" }
正常狀況下,你若是想獲取鍵:threeds2.fingerprint的值,是怎麼獲取的?code
以下:對象
JObject jobj=Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(str); string finger=jobj["details"]["threeds2.fingerprint"];
可是這樣寫是存在風險的。 第一,咱們沒有加任何key的判斷,容易報異常,那麼換一種寫法:blog
Newtonsoft.Json.Linq.JObject jobj = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(str); if (jobj.ContainsKey("details")) { Newtonsoft.Json.Linq.JToken jtoken = jobj["details"]; if (jtoken.Value<string>("threeds2.challengeResult")!=null) { string finger = jtoken["threeds2.challengeResult"].ToString(); } }
爲了避免報異常,加了各類判斷,這樣也不太好,最好的方案以下:token
jobj.SelectToken("details.['threeds2.fingerprint']")).Value<string>();
劃重點:這裏須要注意: SelectToken方法支持咱們輸入深度Key的訪問路徑來獲取數據,父子級使用"."鏈接;若是遇到key含有特殊符號點的,使用中括號加單引號包裹。並且這種寫法不會拋出異常,若是路徑錯誤或不存在返回值爲null。three