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

时间:2013-01-06 23:56:12

标签: android json jackson json.net

我有一个使用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应用程序进行硬编码很长很奇怪。

感谢您提供任何提示和指示=)

1 个答案:

答案 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;

}

此致