2017-04-08 67 views
1
public class A : JObject 
{} 

和我有如下因素反串行化代碼Json.net反序列化到JObject派生類型

using (StreamReader responseStreamReader = new StreamReader(stream)) 
{ 
    using (JsonReader reader = new JsonTextReader(responseStreamReader)) 
    { 
     JsonSerializer serializer = new JsonSerializer(); 
     return serializer.Deserialize<A>(reader); 
    } 
} 

但它引發無效轉換異常

其實解串器只需要創建新的A()而不是新的JObject(),然後做完全相同的事情,這對我來說已經足夠了。

如何反序列化爲更具體的JObject類型?

+0

你到底想達到什麼目的?你爲什麼繼承'JObject'?你爲什麼期望'JsonReader'可以被轉換爲'A'類型? – CodingYoshi

+0

我有很多操縱JObject或JToken的代碼,所以從它繼承將直接啓用此代碼,這將是很好的。 我想添加一些功能。我可以使用擴展方法和合成,但繼承會立即給我所有人。 –

+0

JsonReader會反序列化爲JObject,所以它不應該是一個反序列化的問題,它也是一個JObject –

回答

0

由於Json.Net的內部特別處理JTokens,因此您將無法直接反序列化到您的JObject衍生的A類。但是,您可以通過對代碼進行兩處小改動來輕鬆解決問題。

  1. 添加一個構造函數,以您的A類接受JObject並將同一基類的構造函數。

    public class A : JObject 
    { 
        public A(JObject jo) : base(jo) 
        { 
        } 
    
        public A() : base() 
        { 
        } 
    } 
    
  2. 在你的反序列化方法,反序列化到JObject,然後從構建你A類。

    using (StreamReader responseStreamReader = new StreamReader(stream)) 
    { 
        using (JsonReader reader = new JsonTextReader(responseStreamReader)) 
        { 
         JsonSerializer serializer = new JsonSerializer(); 
         return new A(serializer.Deserialize<JObject>(reader)); 
        } 
    } 
    

小提琴:https://dotnetfiddle.net/S8d3S6

+0

Thx我認爲這是最簡單和最好的解決方案。然而,額外的副本困擾我。 在JObject中的386處加載https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Linq/JObject.cs中的一行o = new JObject(); to T o = new T();會做,但我不想改變和維護這個改變:)。 我想我會去經典的合成方式而不是 –