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

时间:2017-04-08 16:38:02

标签: c# json serialization json.net deserialization

public class A : JObject
{}

我有下面的反序列化代码

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

但它会抛出Invalid Cast Exception

事实上,反序列化器只需要创建新的A()而不是新的JObject()并在此之后完全相同,这对我来说已经足够了。

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

1 个答案:

答案 0 :(得分:0)

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

  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));
        }
    }
    
  3. 小提琴:https://dotnetfiddle.net/S8d3S6