2012-05-03 9 views
0

ジャクソンを使用すると、1つのクラスセットを使用して1つのアプリケーションでJSONを直列化/逆シリアル化できますが、別のアプリケーションで同じJSONをデシリアライズし、ジャクソン - 異なるタイプにデシリアライズする

私は(Spring MVC)Webアプリケーションを使用して、ユーザーがスクリプト内のステップを定義し、それをクライアントアプリケーションで実行することができます。手順はShowDialogStepのようなもので、dialogTextのようなプロパティ、WaitStepのプロパティ、durationのプロパティなどがあります。

クライアントアプリケーションは、サーバーから一連のステップをロードします。しかし、クライアントによってインスタンス化されたクラスは、​​のような実行固有の機能を持つ必要があります。WaitStepの場合は、それがどれだけ待っているかを追跡します。明らかに、サーバー側のアプリケーションではこのことを知る必要はありませんが、あまり簡単な例では、ステップの実行/更新ロジックには、クライアント固有のすべての依存関係が関係しています。

ので、おさらいして私が必要:JSONに「プロトタイプ」のクラスをマッピングする

  • サーバーアプリケーションを、
  • クライアントアプリケーションは、と同じ JSONを読み込みますが、「プロトタイプ」ではなく実行固有のクラスをインスタンス化します。

これはJSONが(むしろ完全修飾より)相対的なクラス名を使用して連載された場合は、おそらくその後、デシリアライザが異なるパッケージに見えるように構成することができ、クライアント側のマッパーに設定することができるようなものだろうそれらの中に実行ロジックを持つ実装については?

あなたがこのアプローチを使用することができます

答えて

3

:サーバー側で

を:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
     include=JsonTypeInfo.As.PROPERTY, property="@type") 
class Prototype { 
... 
} 

objectMapper.registerSubtypes(
      new NamedType(Prototype.class, "Execution"), 
      ... 
); 

それはプロトタイプのインスタンスをシリアル化し、豆の種類を追加します。

{ 
    "@type" : "Execution", 
    ... 
} 

クライアントにサイド:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, 
     include=JsonTypeInfo.As.PROPERTY, property="@type") 
class Execution { 
... 
} 

objectMapper.registerSubtypes(
      new NamedType(Execution.class, "Execution"), // the same name 
    .... 
); 
objectMapper.readValue(....); // will be deserialized to an Execution instance 
関連する問題