正常情况下的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;
}
}
本文介绍了如何使用Jackson库自定义序列化器和反序列化器来实现本地时间日期时间的RESTful JSON表示,包括定制日期时间格式输出,并通过实例代码演示了具体实现过程。
2314

被折叠的 条评论
为什么被折叠?



