您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關解決屬性值反序列化失敗的問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
使用方法:
InternalRecommendRequestFormModel formData = Newtonsoft.Json.JsonConvert.DeserializeObject<InternalRecommendRequestFormModel>(dataInput);
其中:InternalRecommendRequestFormModel是一個復雜的對象,屬性中又包含其他對象和屬性。 dataInput是接口傳入的JSON字符串,它是另一個接口返回的InternalRecommendRequestFormModel對象,當然數據在傳遞的過程中一些屬性發生了變化,按理應該可以正常反序列化,但是在使用的時候卻在反序列化是報錯,無法發序列化其中一個屬性。
那么我們遇到這種復雜的反序列化成對象時該怎么辦?
首先:分析知道,報錯是由于個別屬性發序列化失敗導致,那么只要可以將這部分屬性清空或者移除該屬性的序列化內容,就可以了。
那么:如何在序列化的JSON字符串移除掉一部分屬性呢?
我們首先想到的是,字符串的替換,清空,截取等等,但是想想容易出錯。能不能現將這個字符串變成一個可操作的對象(當然不是InternalRecommendRequestFormModel),然后干掉或者清空某個對象后再轉換成我們想要的對象? 其實我一開想想到object,不是任意對象都是object嗎?
開始嘗試:
object formData = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dataInput);
得到對象如下:
在調試中發現:
((Newtonsoft.Json.Linq.JObject)(JsonConvert.DeserializeObject<object>(dataInput))).ChildrenTokens[46] ,我是可以拿到屬性值的。
也就是說,通過上述代碼可以看出,反序列化的object對象被轉換為了:Newtonsoft.Json.Linq.JObject 對象, 這個對象就是微軟給我們提供的JSON對象的一個基類,也就是說,只要你是一個對象,如果被json序列化后,它就可以幫你反序列化回來。
代碼改進為:
InternalRecommendRequestFormModel formData = new InternalRecommendRequestFormModel();Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput); obj.Remove("opinions"); formData = obj.ToObject<InternalRecommendRequestFormModel>();
總結:
只要JSON字符串是一個對象,當我們直接反序列化遇到,字符串中的部分屬性值不符合要求時,我們可以先將對象轉為:JObject,對對象屬性修正后,再使用JObject提供的ToObject<T>()再轉為需要轉換的對象
Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);
關于解決屬性值反序列化失敗的問題就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。