Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Json.NET:$type变量(使用TypeNameHandling时)是否需要;限定类型名称“;?_Android_Json_Jackson_Json.net - Fatal编程技术网

Android Json.NET:$type变量(使用TypeNameHandling时)是否需要;限定类型名称“;?

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

我有一个使用Json.NET的C#服务器,另一边是一个使用Jackson的JAVA/Android应用程序

我序列化并反序列化了一个名为ProtocolContainer的对象,该对象包含一个名为“SubPacket”的属性:

有许多类继承了“DataPacket”,因此当我从任何地方收到JSON字符串时,我需要能够将子包反序列化到正确的子类中

在我切换到Json.NET之前(当我使用DataContractJsonSerializer时),这一切都很好,但是在切换之后,我还没有真正能够对来自Android设备的数据进行反序列化

我怀疑这与我没有从JAVA发送“限定类型名”有关,我也不想这样做。可以发送名称,例如:

$type:“my.namespace.classname”

但是发送所有与.NET相关的、臃肿的、称为“限定类型名”的文件是不合适的

现在我得到一个JsonSerializationException。这是JSON的简化版本:

{
   "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;

}