溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

解決屬性值反序列化失敗的問(wèn)題

發(fā)布時(shí)間:2020-09-08 12:00:36 來(lái)源:億速云 閱讀:711 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)解決屬性值反序列化失敗的問(wèn)題,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

使用方法:

InternalRecommendRequestFormModel formData = Newtonsoft.Json.JsonConvert.DeserializeObject<InternalRecommendRequestFormModel>(dataInput);

其中:InternalRecommendRequestFormModel是一個(gè)復(fù)雜的對(duì)象,屬性中又包含其他對(duì)象和屬性。  dataInput是接口傳入的JSON字符串,它是另一個(gè)接口返回的InternalRecommendRequestFormModel對(duì)象,當(dāng)然數(shù)據(jù)在傳遞的過(guò)程中一些屬性發(fā)生了變化,按理應(yīng)該可以正常反序列化,但是在使用的時(shí)候卻在反序列化是報(bào)錯(cuò),無(wú)法發(fā)序列化其中一個(gè)屬性。

那么我們遇到這種復(fù)雜的反序列化成對(duì)象時(shí)該怎么辦?

首先:分析知道,報(bào)錯(cuò)是由于個(gè)別屬性發(fā)序列化失敗導(dǎo)致,那么只要可以將這部分屬性清空或者移除該屬性的序列化內(nèi)容,就可以了。

那么:如何在序列化的JSON字符串移除掉一部分屬性呢?

我們首先想到的是,字符串的替換,清空,截取等等,但是想想容易出錯(cuò)。能不能現(xiàn)將這個(gè)字符串變成一個(gè)可操作的對(duì)象(當(dāng)然不是InternalRecommendRequestFormModel),然后干掉或者清空某個(gè)對(duì)象后再轉(zhuǎn)換成我們想要的對(duì)象?  其實(shí)我一開(kāi)想想到object,不是任意對(duì)象都是object嗎?

開(kāi)始嘗試:

object formData = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dataInput);

得到對(duì)象如下:

解決屬性值反序列化失敗的問(wèn)題

在調(diào)試中發(fā)現(xiàn):

((Newtonsoft.Json.Linq.JObject)(JsonConvert.DeserializeObject<object>(dataInput))).ChildrenTokens[46] ,我是可以拿到屬性值的。

也就是說(shuō),通過(guò)上述代碼可以看出,反序列化的object對(duì)象被轉(zhuǎn)換為了:Newtonsoft.Json.Linq.JObject 對(duì)象,  這個(gè)對(duì)象就是微軟給我們提供的JSON對(duì)象的一個(gè)基類(lèi),也就是說(shuō),只要你是一個(gè)對(duì)象,如果被json序列化后,它就可以幫你反序列化回來(lái)。

代碼改進(jìn)為:

InternalRecommendRequestFormModel formData = new InternalRecommendRequestFormModel();Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);
obj.Remove("opinions");
formData = obj.ToObject<InternalRecommendRequestFormModel>();

總結(jié):

只要JSON字符串是一個(gè)對(duì)象,當(dāng)我們直接反序列化遇到,字符串中的部分屬性值不符合要求時(shí),我們可以先將對(duì)象轉(zhuǎn)為:JObject,對(duì)對(duì)象屬性修正后,再使用JObject提供的ToObject<T>()再轉(zhuǎn)為需要轉(zhuǎn)換的對(duì)象

Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);

關(guān)于解決屬性值反序列化失敗的問(wèn)題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI