前言:我們有時常會用到JObject對象接受數據,並通過JObject快速獲取指定key的值,順序的話是沒有問題的,但是假如你遇到如下的JObject對象,該怎麼快速獲取數據呢? { "details": { "threeds2.fingerprint": "123" }, "paymentData ...
前言:我們有時常會用到JObject對象接受數據,並通過JObject快速獲取指定key的值,順序的話是沒有問題的,但是假如你遇到如下的JObject對象,該怎麼快速獲取數據呢?
{ "details": { "threeds2.fingerprint": "123" }, "paymentData": "456" }
正常情況下,你如果想獲取鍵:threeds2.fingerprint的值,是怎麼獲取的?
如下:
JObject jobj=Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(str); string finger=jobj["details"]["threeds2.fingerprint"];
但是這樣寫是存在風險的。 第一,我們沒有加任何key的判斷,容易報異常,那麼換一種寫法:
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(); } }
為了不報異常,加了各種判斷,這樣也不太好,最好的方案如下:
jobj.SelectToken("details.['threeds2.fingerprint']")).Value<string>();
劃重點:這裡需要註意: SelectToken方法支持我們輸入深度Key的訪問路徑來獲取數據,父子級使用"."連接;如果遇到key含有特殊符號點的,使用中括弧加單引號包裹。而且這種寫法不會拋出異常,如果路徑錯誤或不存在返回值為null。