Json.net反序列化为JObject派生类型 [英] Json.net Deserialize to JObject derived type
问题描述
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.
-
向您的
A
类添加一个构造函数,该构造函数接受JObject
并将其传递给基类构造函数.
Add a constructor to your
A
class which accepts aJObject
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屋!