Json.net反序列化为JObject派生类型 [英] Json.net Deserialize to JObject derived type

查看:193
本文介绍了Json.net反序列化为JObject派生类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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);
    }
}

但是它会引发无效的强制转换异常

But it throws Invalid Cast Exception

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

in fact the deserializer just need to create new A() instead of new JObject() and do exactly the same after that, it would be enough for me.

如何反序列化为更特定的JObject类型?

How can I deserialize to a more specific JObject type ?

推荐答案

您将无法直接反序列化到JObject派生的A类,因为Json.Net的内部结构专门处理JTokens.但是,您只需对代码进行两个小的更改就可以轻松解决该问题.

You won't be able to deserialize directly to your JObject-derived A class because the internals of Json.Net handle JTokens specially. However, you can easily work around the problem with two small changes to your code.

  1. 向您的A类添加一个构造函数,该构造函数接受JObject并将其传递给基类构造函数.

  1. Add a constructor to your A class which accepts a JObject and passes the same to the base class constructor.

public class A : JObject
{
    public A(JObject jo) : base(jo)
    {
    }

    public A() : base()
    {
    }
}

  • 在反序列化方法中,反序列化为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

    这篇关于Json.net反序列化为JObject派生类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆