簡介:本人在開發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物件被轉換為了: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>()再轉為需要轉換的物件
<strong><span style="font-size: 15px">Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);</span></strong><br>
以上是屬性值反序列化失敗怎麼解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!