我有一个使用Json.NET的C#-server,另一边是使用Jackson的JAVA / Android-app。
我序列化和反序列化一个名为ProtocolContainer的对象,该对象包含一个名为" SubPacket"的属性:
public class ProtocolContainer
{
public DataPacket SubPacket { get; set; }
// ...
}
有许多类继承" DataPacket",因此当我从任何地方收到JSON字符串时,我需要能够将SubPacket反序列化为正确的子类。
在我切换到Json.NET之前(当我使用DataContractJsonSerializer时)这很好用,但是在切换之后我还没有能够反序化来自Android设备的数据。
我怀疑这与我不发送"合格类型名称"这一事实有关。来自JAVA,我也不想这样做。可以发送名称,例如:
" $类型":" my.namespace.classname"
但是发送所有与.NET相关的臃肿混乱是不合适的,这是#34;合格的类型名称"。
现在我得到一个JsonSerializationException。这是JSON的简化版本:
{
"SubPacket":{
"$type":"my.namespace.myClass",
"HardwareId":"a5af9321038c38dc"
},
}
即使该类存在于.NET端,它也无法通过以下错误反序列化它:
{Newtonsoft.Json.JsonSerializationException:JSON中指定的类型 ' my.namespace.myClass'没有解决。 Path' SubPacket。$ type',line 1,位置138.在......
如上所述,我不想写出整个汇编字符串,这对于JAVA应用程序进行硬编码很长很奇怪。
感谢您提供任何提示和指示=)
答案 0 :(得分:0)
您可以使用自定义转换器并覆盖ReadJson方法,如下所示:
public override object ReadJson(JsonReader reader, Type objectType, ob
{
TypedObject toReturn = null;
if (reader.TokenType == JsonToken.StartObject)
{
var obj = JObject.Load(reader);
var json = obj.ToString();
string readType = obj["type"].ToString();
switch (readType)
{
case "aClass":
toReturn = JsonConvert.DeserializeObject<AClass>(json);
break;
case "my.namespace.myClass";
toReturn = JsonConvert.DeserializeObject<MyClass>(json);
break;
}
}
return toReturn;
}
此致