1

Json.NET を使用する C# サーバーと、Jackson を使用する Java/Android アプリがあります。

ProtocolContainer というオブジェクトをシリアライズおよびデシリアライズします。そのオブジェクトには、「SubPacket」というプロパティが 1 つ含まれています。

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 に答える