Мне нужно десериализовать длинный и сложный json, для которого я написал набор java-классов для отображения данных, и мне пришлось написать собственные десериализаторы для многих полей различных типов (включая String, Boolean, BigDecimal, и др.) .
Я знаю, что могу аннотировать все поля в классах Java с помощью соответствующего пользовательского десериализатора (как показано ниже), но тогда мне нужно будет аннотировать почти все поля во всех классах.
@JsonDeserialize(using = CustomBooleanJsonDeserializer.class)
private boolean active;
Я также знаю, что могу зарегистрировать модуль в Spring по умолчанию ObjectMapper
(например, здесь ), но я просто хочу использовать эти пользовательские десериализаторы для этих конкретных классов.
@Bean
public Module customDeserializersModule() {
SimpleModule module = new SimpleModule();
module.addDeserializer(Boolean.class, new CustomBooleanJsonDeserializer());
// add other custom deserializers
return module;
}
Я даже знаю, что могу использовать пользовательский ObjectMapper
в RestController
, но я не хочу отказываться от удобства автоматического связывания данных через @RequestBody
, потому что я должен запретить другим использовать это без необходимые нестандартные десериализаторы.
@RequestMapping(method = RequestMethod.POST, value = "/data")
public ResponseEntity<ServerInfo> register(@RequestBody DataMapper data) {
// DataMapper is the target POJO class of the json's deserialization
}
Короче, я ищу что-то подобное на уровне класса:
@JsonDeserialize(using = CustomStringJsonDeserializer.class, forType = String.class)
@JsonDeserialize(using = CustomBooleanJsonDeserializer.class, forType = Boolean.class)
@JsonDeserialize(using = CustomBigDecimalJsonDeserializer.class, forType = BigDecimal.class)
public class DataMapper implements Serializable {
// obviously, @JsonDeserialize doesn't have a forType method
}
или, может быть, каким-то образом реализовать специальный десериализатор для класса DataMapper
, который определяет, как десериализовать каждое поле в соответствии с его типом данных (без необходимости аннотировать каждое поле):
@JsonDeserialize(using = DataMapperJsonDeserializer.class)
public class DataMapper implements Serializable {
// How can I implement the DataMapperJsonDeserializer with these
// characteristics? I know about the ContextualDeserializer interface,
// but I don't know how to use it without annotating each field.
}
или каким-то образом ограничение действия модуля только одним пакетом или набором классов :
module.restrictedTo(/*some package or set of classes*/);
// com.fasterxml.jackson.databind.Module doesn't have a restrictedTo method