Как разобрать ввод объекта Date полей с форматом данного в самой предметной области - PullRequest
0 голосов
/ 18 июня 2019

У меня есть проект Spring, где в методе контроллера у меня есть @RequestBody Object obj в качестве одного из параметров. Объект имеет Date поля, которые с пользовательскими JSON Serializer и пользовательскими JSON Deserializer реализованы с использованием @JsonDeserializer и @JsonSerializer и двух классов.

Когда я отправляю запрос в метод контроллера, Spring вызывает поле десериализатора и десериализации строки Джексона объекта в Date.

Когда десериализатор десериализует строку даты и возвращает объект Date, я хочу, чтобы он проанализировал строку в соответствии с форматом, заданным в поле format объекта (т. Е. Формат также указан во входных данных), и создайте Date возразить соответственно. Как это можно реализовать?

class MyObject{
    private String format; //field containing the format
    private Date currentDate;// this field should get formatted according to the 'format' field value

    @JsonSerialize(using = CustomJSONSerializer.class)
    public Date getCurrentDate(){
        return this.currentDate;
    }

    @JsonDeserialize(using = CustomJsonDeserializer.class)
    public void setCurrentDate(Date currentDate){
        this.currentDate=currentDate;
    }
}


class CustomJsonDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    //this format I want it to receive from the input as well i.e from the Object's format named instance variable.
    final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
    try {
        return simpleDateFormat.parse(jp.getText());
    } catch (ParseException e) {
        //catch exception
    }
}

Можем ли мы использовать JsonParser или DeserializationContext для решения этой проблемы?

1 Ответ

1 голос
/ 18 июня 2019

Вам необходимо реализовать десериализатор / сериализатор для всего класса MyObject, чтобы иметь доступ ко всем обязательным полям.См. Ниже пример:

public class MyObjectJsonDeserializer extends JsonDeserializer<MyObject> {
    @Override
    public MyObject deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        ObjectNode root = p.readValueAsTree();
        String format = root.get("format").asText();

        MyObject result = new MyObject();
        result.setFormat(format);

        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        try {
            result.setCurrentDate(dateFormat.parse(root.get("currentDate").asText()));
        } catch (ParseException e) {
            throw new JsonParseException(p, e.getMessage(), e);
        }

        return result;
    }
}

Вы можете использовать его:

@JsonDeserialize(using = MyObjectJsonDeserializer.class)
public class MyObject {

Аналогично, вы можете реализовать и зарегистрировать сериализатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...