2

Jackson ライブラリを使用してカスタム シリアライザーを作成し、それらをカスタム ObjectMapper 内に登録しています。ただし、より具体的なカスタム シリアライゼーションが記述されていない場合に、オブジェクトの文字列表現を単純に出力するようにデフォルトのシリアライゼーションを変更したいとも考えています。

たとえば、デフォルトのシリアライザーに加えて、クラス "Map" と "Entry" のカスタム シリアライザーを作成したとします。次に、カスタム ObjectMapper 内のシリアル化モジュールは次のようになります。

SimpleModule module = new SimpleModule("module", new Version(0, 1, 0, "alpha", null, null));
module.addSerializer(Entry.class, new EntryJsonSerializer());
module.addSerializer(Map.class, new MapJsonSerializer());
module.addSerializer(Object.class, new DefaultJsonSerializer());
this.registerModule(module);

ただし、モジュールは DefaultJsonSerializer を使用して Map および Entry オブジェクトをシリアル化することがわかりました (これらは Object オブジェクトでもあるため)。

Entry オブジェクトと Map オブジェクトが意図したとおりにシリアル化されるようにしながら、デフォルトのシリアル化動作を変更するにはどうすればよいですか?

4

2 に答える 2

1

単一のシリアライザーを作成し、一連の if ステートメントを使用して優先順位付けを実装することで、この問題を回避しました。

public final class UnifiedJsonSerializer extends JsonSerializer<Object> {
    @Override
    public void serialize(Object object, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        if (object instanceof Entry) {
            // Entry serialization code
        } else if (object instanceof Map) {
            // Map serialization code
        } else  {
            // default serialization code
        }
}
于 2013-04-30T20:25:37.607 に答える
1

問題はおそらく、実際の値の型 (文字列など) がシリアライザーの検索に使用されていることです。

解決策の 1 つは、値型がわかっている場合は、値型のシリアライザーを登録することです。

または、静的型付けの使用を強制することもできます。これにより、シリアライザーのルックアップで、実際のランタイム型ではなく、宣言された (静的) 型が使用されます。これは次の方法で実行できます。

objectMapper.enable(MapperFeature.USE_STATIC_TYPING);
于 2013-04-26T17:12:02.973 に答える