Как я могу заставить Джексона десериализовать объект Long to Date? - PullRequest
0 голосов
/ 30 марта 2011

Я сериализую некоторые java.util.Dates в карте. Даты сериализуются в Longs (Джексон записывает значение Long экземпляра Date в строку JSON), однако они не десериализуются обратно в Date экземпляры, а как Long экземпляры.

Я бы хотел, чтобы Джексон десериализовал даты назад к объектам Date (а не отформатировал Strings или Longs), как мне этого добиться?

Map<String, Comparable<?>> change = new HashMap<String, Comparable<?>>();
    change.put("DESCRIPTION", "LIBOR");
    change.put("RATE", "1.8");
    change.put("DATE", Util.newDate(2009, 7, 1)); // Returns a java.util.Date

Производит

{"DESCRIPTION":"LIBOR"},{"RATE":"1.8"},{"DATE":1246402800000}, ... }

Что нормально. Тем не менее, дата String десериализуется (раздувается) обратно в экземпляр java.lang.Long, когда я хочу, чтобы это был экземпляр java.util.Date - как и началось. т.е. Map change теперь содержит три записи; Описание как String, Оценить как Float и Дата как Long.

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Вы хотите использовать org.codehaus.jackson.map.JsonDeserializer и написать собственный код десериализации. Что-то вроде:

public class DateDeserializer extends JsonDeserializer<Long> {
    @Override
    public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
       ... custom logic
    }
}

Полагаю, вам нужно выяснить, когда свойство Long должно быть десериализовано до Date. Может быть, использовать аннотации на ваших pojos?

0 голосов
/ 31 марта 2011

Я не знаю, будет ли какое-либо помощь в представлении даты в виде строки?

Если да, то вы можете попробовать установить DateFormat в ObjectMapper.Десериализация будет тогда в читаемом формате String.

Например, для приведенного ниже кода вывод будет выглядеть как [{"birthDate": "30 марта 2011 г."}]

    @Test
public void testJsonConvertDate(){

    ObjectMapper mapper = new ObjectMapper();
    mapper.getSerializationConfig().setDateFormat(DateFormat.getDateInstance(DateFormat.LONG));
    StringWriter stringWriter = new StringWriter();
    try {
        mapper.writeValue(stringWriter, Arrays.asList(new TestUser(new Date())));
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    System.out.println(stringWriter.toString());
}

private class TestUser {
    Date birthDate;

    private TestUser(Date birthDate) {
        this.birthDate = birthDate;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
}
...