C# Json.net反序列化为JObject派生类型

C# Json.net反序列化为JObject派生类型,c#,json,serialization,json.net,deserialization,C#,Json,Serialization,Json.net,Deserialization,我有下面的反序列化代码 public class A : JObject {} 使用(StreamReader responseStreamReader=新的StreamReader(stream)) { 使用(JsonReader reader=newJSontextReader(responseStreamReader)) { JsonSerializer serializer=新的JsonSerializer(); 返回序列化程序。反序列化(读取器); } } 但它抛出无效的强制转换异

我有下面的反序列化代码

public class A : JObject
{}
使用(StreamReader responseStreamReader=新的StreamReader(stream))
{
使用(JsonReader reader=newJSontextReader(responseStreamReader))
{
JsonSerializer serializer=新的JsonSerializer();
返回序列化程序。反序列化(读取器);
}
}
但它抛出无效的强制转换异常

事实上,反序列化程序只需要创建一个新的A()而不是新的JObject(),然后执行完全相同的操作,这对我来说就足够了


如何反序列化到更具体的JObject类型?

您将无法直接反序列化到JObject派生的
a
类,因为Json.Net的内部特别处理JToken。但是,您可以通过对代码进行两个小的更改来轻松解决这个问题

  • 将构造函数添加到
    a
    类,该类接受
    JObject
    并将其传递给基类构造函数

    using (StreamReader responseStreamReader = new StreamReader(stream))
    {
        using (JsonReader reader = new JsonTextReader(responseStreamReader))
        {
            JsonSerializer serializer = new JsonSerializer();
            return serializer.Deserialize<A>(reader);
        }
    }
    
  • 在反序列化方法中,反序列化到一个JObject,然后从中构造一个

    public class A : JObject
    {
        public A(JObject jo) : base(jo)
        {
        }
    
        public A() : base()
        {
        }
    }
    
    使用(StreamReader responseStreamReader=新的StreamReader(stream))
    {
    使用(JsonReader reader=newJSontextReader(responseStreamReader))
    {
    JsonSerializer serializer=新的JsonSerializer();
    返回新的(序列化程序.反序列化(读取器));
    }
    }
    

  • Fiddle:

    您将无法直接反序列化到JObject派生的
    类,因为Json.Net的内部特别处理JTokens。但是,您可以通过对代码进行两个小的更改来轻松解决这个问题

  • 将构造函数添加到
    a
    类,该类接受
    JObject
    并将其传递给基类构造函数

    using (StreamReader responseStreamReader = new StreamReader(stream))
    {
        using (JsonReader reader = new JsonTextReader(responseStreamReader))
        {
            JsonSerializer serializer = new JsonSerializer();
            return serializer.Deserialize<A>(reader);
        }
    }
    
  • 在反序列化方法中,反序列化到一个JObject,然后从中构造一个

    public class A : JObject
    {
        public A(JObject jo) : base(jo)
        {
        }
    
        public A() : base()
        {
        }
    }
    
    使用(StreamReader responseStreamReader=新的StreamReader(stream))
    {
    使用(JsonReader reader=newJSontextReader(responseStreamReader))
    {
    JsonSerializer serializer=新的JsonSerializer();
    返回新的(序列化程序.反序列化(读取器));
    }
    }
    

  • 小提琴手:

    你想达到什么目的?您为什么要继承
    JObject
    ?为什么您希望
    JsonReader
    可以强制转换为类型
    a
    ?我有很多代码可以操作JObject或JToken,因此从它继承将直接启用此代码,这将非常好。我想给它添加一些功能。我可以使用扩展方法和合成,但继承将一次提供所有功能。JsonReader将反序列化到JObject,因此将其反序列化到JObject应该不会有问题。这是一个JObject,您试图实现什么?您为什么要继承
    JObject
    ?为什么您希望
    JsonReader
    可以强制转换为类型
    a
    ?我有很多代码可以操作JObject或JToken,因此从它继承将直接启用此代码,这将非常好。我想给它添加一些功能。我可以使用扩展方法和合成,但继承将一次提供所有功能。JsonReader将反序列化到JObject,因此将其反序列化到JObject tooThx应该不是问题,我认为这是最简单和最好的解决方案。然而,额外的副本困扰着我。将386处加载的一行从JObject o更改为new JObject();to to to=新的T();我会的,但我不想改变和维持这个改变:)。我想我会选择经典的合成方法,而不是传统的合成方法。我认为这是最简单和最好的解决方案。然而,额外的副本困扰着我。将386处加载的一行从JObject o更改为new JObject();to to to=新的T();我会的,但我不想改变和维持这个改变:)。我想我会选择经典的合成方法