2017-04-08 104 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();会做,但我不想改变和维护这个改变:)。 我想我会去经典的合成方式而不是 –