首頁  >  文章  >  後端開發  >  屬性值反序列化失敗怎麼解決?

屬性值反序列化失敗怎麼解決?

零下一度
零下一度原創
2017-06-23 16:22:114294瀏覽

簡介:本人在開發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(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>()再轉為需要轉換的物件

<strong><span style="font-size: 15px">Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);</span></strong><br>

以上是屬性值反序列化失敗怎麼解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn