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);
}
}
类
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();我会的,但我不想改变和维持这个改变:)。我想我会选择经典的合成方法