簡介:本人在開發webapi介面時遇到了:一個複雜的Json字串在還原序列化為對象時報,無法發序列化其中的一個屬性對象?
使用方法:
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);