3

シリアル化できる機能が必要ですMap<CustomType1, CustomType2>。JsonSerializerから継承したカスタムSerializerを作成します。また、単純なモジュールを作成して、マッパーに登録します。

SimpleModule myModule = new SimpleModule("myModule");
myModule.addKeySerializer(CustomType1.class, new CustomType1Serializer());
myModule.addSerializer(CustomType1.class, new CustomType1Serializer());
mapperInstance.registerModule(myModule);

CustomType1のインスタンスをシリアル化するだけでは完全に機能しますが、マップを作成してシリアル化しようとすると、jacksonはシリアライザーをスキップしてを使用しStdKeySerializerます。それを修正する方法???

ご清聴ありがとうございました。

4

2 に答える 2

5

この問題は、Jacksonによるジェネリックオブジェクトの処理に関連しているようです。この問題を回避する1つの方法は、スーパータイプトークンを使用してマップタイプを厳密に定義することです。図解:

final ObjectMapper mapper = new ObjectMapper();

final SimpleModule module = new SimpleModule("myModule",
        Version.unknownVersion());
module.addKeySerializer(CustomType1.class, new CustomType1Serializer());
mapper.registerModule(module);

final MapType type = mapper.getTypeFactory().constructMapType(
        Map.class, CustomType1.class, CustomType2.class);
final Map<CustomType1, CustomType2> map = new HashMap<CustomType1, CustomType2>(4);
final ObjectWriter writer = mapper.writerWithType(type);
final String json = writer.writeValueAsString(map);
于 2012-12-19T01:33:51.540 に答える
1

addSerializerとaddKeySerializerは、単純な非POJOタイプのみを処理する利用可能なシリアライザーの2つのタイプにすぎません。マップやコレクションなどのより複雑なタイプのカスタムシリアル化を行うには、modifyMapSerializerメソッドをオーバーライドしてカスタムシリアル化を返すBeanSerializerModifierを使用して、モジュールで.setSerializerModifierを実行する必要があります。

于 2017-06-24T22:23:25.083 に答える