我從json格式的服務接收到一些數據。部分數據是BASE類的對象(比如說)。有許多類從它派生出來: 不使用程序集名稱反序列化多態類型,只用Newtonsoft lib
現在服務器發送一個固定的結構json,並且BASE類型的對象位於它中。一些示例響應這裏我列出了下來:
"{"Status":"Success","B":{"$type":"B1","id":"123"},"C":null}"
"{"Status":"Success","A":{"$type":"A3","name":"Jon"},"B":{"$type":"B2","id":"A34J"}}"
我在我的客戶端模型中定義的類同一層次,我使用NewtonSoft JSON庫反序列化的內容。正如你所看到的,服務器發送從BASE類派生的每個對象的$ type信息,我希望能夠在客戶端反序列化過程中將這些對象加載到它們各自的類型中。我deserliaze的JSON轉換成類型響應
class Response
{
string Status;
BASE object1;
BASE object2;
}
Response resp = JsonConvert.DeserializeObject<Response>(jsonServiceMsg, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Binder = mycustombinder });
的目標正如你所看到的,我不指定對象B1或A3或B2的確切類型,在響應對象,我想Newtonsoft LIB給init object1和object2,並在json消息中使用基於$ type值的適當類型。
注意,服務具有這些類(基礎和所有derivetives) 在不同的命名空間中定義和我(客戶端)在不同 命名空間。但爲了簡單起見,在序列化爲json響應時,通過使用自定義綁定器,服務不會綁定名稱空間 。
我知道我可以通過定義一個定製綁定(從SerializationBinder派生類),並重寫BindToName和BindToType性質(refer link)
實現這一點,但問題是,我們不希望使用JSON。來自System.Runtime.Serialization的Net SerializationBinder。我們的模塊只能使用Newtonsoft lib。任何解決方案?
您可以按照[使用json.net反序列化多態json類的類型](https://stackoverflow.com/questions/19307752)的方式爲'Base'創建一個自定義'JsonConverter'。儘管在這種情況下,你確實有類型信息,但你可以在轉換器中按照答案的方式手動處理它。 – dbc
我收到的json非常大,兩個Base類型的對象只是它的一部分。難道你不認爲如果我通過自定義的JsonConverter去編寫太多的代碼。我也必須序列化它。這不是太多的代碼嗎? – Rajat
'JsonConverter'將用於'Base'及其抽象子類。你需要做的就是維護一個從類型名到類型的查找字典。 JSON的整體大小是不相關的,其他類的數量無關緊要。當然,編寫自己的'SerializationBinder'會更容易,也就是解決這個問題的預期方式 - 但無論出於何種原因你不想這樣做。 – dbc