正常情况下的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<LocalDateTime> {
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<LocalDateTime> 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<LocalDateTime> {
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;
}
}