Map (非文字列キー) とその他のフィールドを含むクラスがあります。
public class MyClass() {
private Map<KeyObject, OtherObject> map;
private String someField;
public MyClass(Map<KeyObject, OtherObject> map, String someField) {
this.map = map;
this.someField = someField;
}
// Getters & Setters
}
Jackson を使用して、このクラスをシリアライズおよびデシリアライズしたいと思います。私はそれを行う別の方法を見て、 jackson モジュールを使用してみることにしました。
この投稿に従って、JsonDeserializer と JsonSerializer を拡張しました。問題は、これらのクラスを型付けする必要があることです。したがって、次のようになります。
public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
KeySerializer についても同様です。
次に、モジュールに追加します。
module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
しかし、例外が発生しているため、これは明らかに間違っています:
keySerializer does not define valid handledType() -- must either register with method that takes type argument or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
シリアライザーとデシリアライザーをMyClassに入力することもできましたが、そのすべてを手動で解析する必要があり、これは合理的ではありません。
アップデート:
注釈を使用して、コード内でモジュールの作成を回避することができました
@JsonDeserialize(using = keyDeserializer.class)
@JsonSerialize(using = keySerializer.class)
private Map<KeyObject, OtherObject> map;
しかし、toString() 出力から自分でマップ構造全体をシリアライズ/デシリアライズする必要があります。そこで、別の注釈を試しました:
@JsonDeserialize(keyUsing = MyKeyDeserializer.class)
private Map<KeyObject, OtherObject> map;
MyKeyDeserializer が拡張org.codehaus.jackson.map.KeyDeserializer
され、メソッドをオーバーライドする場所
public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {...}
次に、キークラスの toString() 出力から手動でキーをデシリアライズします。
これは最適ではありません (この toString() メソッドへの依存関係)。より良い方法はありますか?