1

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

我序列化和反序列化一个名为 ProtocolContainer 的对象,该对象除其他外包含一个名为“SubPacket”的属性:

public class ProtocolContainer
{
    public DataPacket SubPacket { get; set; }
    // ...
}

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

这在我切换到 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 应用程序来说既长又奇怪。

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

4

1 回答 1

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;

}

问候

于 2013-04-04T11:41:55.350 回答