正常情况下的JSON 处理,对于JodaTime:
类:
public class ExampleDto { private LocalDateTime asDefault = LocalDateTime.now(); ...
json转换:
import com.fasterxml.jackson.databind.ObjectMapper; ... ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(new ExampleDto());
得到的结果:
{"asDefault":{"era":1,"dayOfMonth":24,"dayOfWeek":6,"dayOfYear":24,"year":2015,"yearOfEra":2015,...}
可以发现的是,不是很RESTFUL, 不能很好的处理
Jackson 提供的一种方式,@LocalDateTimeSerializer和@LocalDateTimeDeserializer
public class ExampleDto { @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime asArray = LocalDateTime.now();
这样得到的结果是:
{"asArray":[2015,1,24,10,31,3,379]}
从这里看出,我可以定制自己的Serializer,比如我想要得到:
{"custom": {"date":"2015-01-24", "time":"10:31:03" }
代码:
Class CustomLocalDateTimeSerializer public class CustomLocalDateTimeSerializer extends StdScalarSerializer{ private final static DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd"); private final static DateTimeFormatter TIME_FORMAT = DateTimeFormat.forPattern("HH:mm:ss"); public CustomLocalDateTimeSerializer() { super(LocalDateTime.class); } protected CustomLocalDateTimeSerializer(Class t) { super(t); } @Override public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider prov ider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("date", DATE_FORMAT.print(value)); jgen.writeStringField("time", TIME_FORMAT.print(value)); jgen.writeEndObject(); } } Class CustomLocalDateTimeDeserializer public class CustomLocalDateTimeDeserializer extends StdScalarDeserializer { private final static DateTimeFormatter DATETIME_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); public CustomLocalDateTimeDeserializer() { super(LocalDateTime.class); } protected LocalDateTimeDeserializerMongoDb(Class> vc) { super(vc); } @Override public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { String dateStr = null; String timeStr = null; String fieldName = null; while (jp.hasCurrentToken()) { JsonToken token = jp.nextToken(); if (token == JsonToken.FIELD_NAME) { fieldName = jp.getCurrentName(); } else if (token == JsonToken.VALUE_STRING) { if (StringUtils.equals(fieldName, "date")) { dateStr = jp.getValueAsString(); } else if (StringUtils.equals(fieldName, "time")) { timeStr = jp.getValueAsString(); } else { throw new JsonParseException("Unexpected field name", jp.getTokenLocation()); } } else if (token == JsonToken.END_OBJECT) { break; } } if (dateStr != null && timeStr != null) { LocalDateTime dateTime = LocalDateTime.parse(dateStr + " " + timeStr, DATETIME_FORMAT); return dateTime; } return null; } }