Реализуйте собственный десериализатор и добавьте аннотацию @JsonDeserialize(using = DateDeserializer.class)
в свое поле.
Взгляните на этот пример:
Ваш Json-Bean:
public class Foo {
private String name;
@JsonProperty
@JsonDeserialize(using = DateDeserializer.class)
private Map<String, Object> dates;
[...] // getter, setter, equals, hashcode
}
Десериализатор:
public class DateDeserializer extends JsonDeserializer<Map<String, Object>> {
private TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
@Override
public Map<String, Object> deserialize(JsonParser p, DeserializationContext ctxt, Map<String, Object> target) throws IOException, JsonProcessingException {
Map<String, Long> map = new ObjectMapper().readValue(p, typeRef);
for(Entry<String, Long> e : map.entrySet()){
Long value = e.getValue();
String key = e.getKey();
if(value instanceof Long){ // or if("date".equals(key)) ...
target.put(key, new Date(value));
} else {
target.put(key, value); // leave as is
}
}
return target;
}
@Override
public Map<String, Object> deserialize(JsonParser paramJsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return this.deserialize(paramJsonParser, ctxt, new HashMap<>());
}
}
Простой тест:
public static void main(String[] args) throws Exception {
Foo foo1 = new Foo();
foo1.setName("foo");
foo1.setData(new HashMap<String, Object>(){{
put("date", new Date());
put("bool", true);
put("string", "yeah");
}});
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(foo1);
System.out.println(jsonStr);
Foo foo2 = mapper.readValue(jsonStr, Foo.class);
System.out.println(foo2.equals(foo1));
}
person
dieter
schedule
19.03.2018
Object
, Джексон не может отличить даты от реальных длинных чисел. Если возможно, вы могли бы создать оболочку дляObject
, которая содержит информацию о типе java, и использовать ее для десериализации фактического значения или (если это не вариант), возможно, возможно форматирование дат в виде строк ISO-8601? Таким образом, вы можете проверить значение на соответствие ожидаемому шаблону и преобразовать его в дату. - person dpr   schedule 21.03.2018"[date]"
, которое затем будет десериализовано как дата. - person Steffen Harbich   schedule 21.03.2018