#java #jackson #deserialization #date-formatting
#java #jackson #Десериализация #форматирование даты
Вопрос:
В пользовательском десериализаторе для объекта я хочу вызвать десериализацию (некоторых) полей рекурсивно таким образом, чтобы соблюдались аннотации @JsonFormat. Более конкретно, вот как выглядит десериализатор:
public class DealPatchDeserializer extends JsonDeserializer<DealPatch> {
public DealPatch deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode root = p.readValueAsTree();
JsonNode redeemableFromNode = root.path("redeemableFrom");
JsonParser redeemableFromParser = redeemableFromNode.traverse(p.getCodec());
Date date = redeemableFromParser.readValueAs(Date.class);
}
В этом примере JsonParser.readValueAs() не принимает аннотированные
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
private Date redeemableTo;
учитывается шаблон и, таким образом, генерируется исключение из-за неизвестного (немецкого) формата даты.
Есть ли какой-либо способ десериализовать поля объекта, чтобы он соблюдал аннотированные форматы?
Ответ №1:
Если весь redeemableFrom
объект не нуждается в пользовательской десериализации, вы можете проанализировать его как обычный Java-объект с аннотациями, вызвав treeToValue()
. Что-то вроде этого должно сработать:
p.getCodec().treeToValue(redeemableFromNode, RedeemableFrom.class);
Комментарии:
1. Нет. @JsonFormat не используется, и, как следствие, возникает исключение HttpMessageNotReadableException, поскольку значение не может быть десериализовано до даты. Я хочу сказать: у меня есть поле с аннотацией формата, как я могу вызвать десериализацию этого поля, чтобы использовался указанный формат?