クラス B を含むクラス A の 2 つのクラスがあります。json をクラス A タイプにアンマーシャリングする必要がありますが、クラス A にはデシリアライゼーション機能のセットが 1 つ、クラス B には別のセットが必要です。出来ますか?それを行う最善の方法は何ですか?どうも!
2 に答える
最終的には、内部型に独自のデシリアライザーを定義し、内部で独自の新しい静的 ObjectMapper を定義して必要な構成を保持することで解決しました。
public ObjectMapper MyObjectMapper() { ObjectMapper objectMapper = new ObjectMapper();
objectMapper
.setAnnotationIntrospector(new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()))
SimpleModule simpleModule = new SimpleModule("PostSurveyModule", Version.unknownVersion());
simpleModule.addDeserializer(MyInnerObject.class, new MyInnerObjectDeserializer());
objectMapper.registerModule(simpleModule);
return objectMapper;
}
public static class MyInnerObjectDeserializer extends JsonDeserializer { static ObjectMapper objectMapper = new ObjectMapper();
static {
objectMapper
.setVisibilityChecker(objectMapper.getDeserializationConfig().getDefaultVisibilityChecker()
.withGetterVisibility(JsonAutoDetect.Visibility.PUBLIC_ONLY));
objectMapper.addMixInAnnotations(MyInnerObject.class, MyInnerObjectMixin.class); //some mixin to add
}
@Override
public MyInnerObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
MyInnerObject myInnerObject = objectMapper.readValue(jp, MyInnerObject.class);
return myInnerObject;
}
}
実際に、SerializationFeature
またはDeserializationFeature
呼び出しごとに変更したい場合は、でメソッドを使用するのでObjectMapper
はなく、構築ObjectReader
したり、ObjectWriter
次のようにしたりします。
static final ObjectMapper mapper = ...; // only create once, acts as factor
// later on
byte[] json = mapper.writer(SerializationFeature.INDENT_OUTPUT)
.without(SerializationFeature. WRAP_EXCEPTIONS)
.writeValueAsBytes(value);
MyType result = mapper.readerFor(MyType.class)
.with(DeserializationFeature.UNWRAP_ROOT_VALUE)
// and more 'with' or 'without' calls
readValue(json);
の構築ObjectMapper
は高価であり、インスタンスは絶対に再利用する必要がありますが、 と の構築ObjectReader
はObjectWriter
安価であり、読み取り/書き込みごとに実行されることを意図していることに注意してください。そのため、それらは再利用できますが (インスタンスは完全にスレッドセーフで不変です)、必ずしも多くの必要性があるわけではありません。