Android Json.NET:$type变量(使用TypeNameHandling时)是否需要;限定类型名称“;?
我有一个使用Json.NET的C#服务器,另一边是一个使用Jackson的JAVA/Android应用程序 我序列化并反序列化了一个名为ProtocolContainer的对象,该对象包含一个名为“SubPacket”的属性: 有许多类继承了“DataPacket”,因此当我从任何地方收到JSON字符串时,我需要能够将子包反序列化到正确的子类中 在我切换到Json.NET之前(当我使用DataContractJsonSerializer时),这一切都很好,但是在切换之后,我还没有真正能够对来自Android设备的数据进行反序列化 我怀疑这与我没有从JAVA发送“限定类型名”有关,我也不想这样做。可以发送名称,例如: $type:“my.namespace.classname” 但是发送所有与.NET相关的、臃肿的、称为“限定类型名”的文件是不合适的 现在我得到一个JsonSerializationException。这是JSON的简化版本:Android Json.NET:$type变量(使用TypeNameHandling时)是否需要;限定类型名称“;?,android,json,jackson,json.net,Android,Json,Jackson,Json.net,我有一个使用Json.NET的C#服务器,另一边是一个使用Jackson的JAVA/Android应用程序 我序列化并反序列化了一个名为ProtocolContainer的对象,该对象包含一个名为“SubPacket”的属性: 有许多类继承了“DataPacket”,因此当我从任何地方收到JSON字符串时,我需要能够将子包反序列化到正确的子类中 在我切换到Json.NET之前(当我使用DataContractJsonSerializer时),这一切都很好,但是在切换之后,我还没有真正能够对来自A
{
"SubPacket":{
"$type":"my.namespace.myClass",
"HardwareId":"a5af9321038c38dc"
},
}
即使该类存在于.NET端,它也无法对其进行反序列化,出现以下错误:
{Newtonsoft.Json.JsonSerializationException:在Json中指定的类型
“my.namespace.myClass”未解析。路径“SubPacket.$type”,第行
1,位置138。在
如前所述,我不想写出整个汇编字符串,这对于硬编码到JAVA应用程序来说既长又奇怪
感谢您提供的所有提示和指针=)您可以使用自定义转换器并覆盖ReadJsonmethod,如下所示:
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;
}
public覆盖对象ReadJson(JsonReader-reader,类型objectType,ob
{
TypedObject toReturn=null;
if(reader.TokenType==JsonToken.StartObject)
{
var obj=JObject.Load(读卡器);
var json=obj.ToString();
string readType=obj[“type”].ToString();
开关(readType)
{
案例“aClass”:
toReturn=JsonConvert.DeserializeObject(json);
打破
案例“my.namespace.myClass”;
toReturn=JsonConvert.DeserializeObject(json);
打破
}
}
回归回归;
}
问候
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;
}