我需要将 Joda DateTime 序列化为 JSON 作为单个字符串。我使用 JsonSerializer 的实现,它假设生成字符串,但我得到具有很多属性的对象:
"metrics":{"startTimestamp":{"year":2014,"dayOfMonth":11,"dayOfWeek":2,"era":1,"dayOfYear":315,"centuryOfEra":20,"yearOfCentury":14,"monthOfYear":11,"weekOfWeekyear":46,"millisOfSecond":505,"millisOfDay":36348505,"secondOfMinute":48,"secondOfDay":36348,"minuteOfHour":5,.......... etc
但是我需要像 dd.mm.yyyy HH:mm:ss.SSS
这样的字符串。如何做到这一点?
自定义日期序列化器
public class CustomDateSerializer extends JsonSerializer<DateTime> {
private static DateTimeFormatter formatter = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm:ss.SSS");
@Override
public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) throws IOException, JsonProcessingException {
gen.writeString(formatter.print(value));
// System.out.println(formatter.print(value));
}
@Override
public Class<DateTime> handledType() {
return DateTime.class;
}
}
指标
import app.service.CustomDateSerializer;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
public class Metrics {
// @JsonSerialize(using = CustomDateSerializer.class)
DateTime startTimestamp;
// @JsonSerialize(using = CustomDateSerializer.class)
DateTime endTimestamp;
Period period;
@JsonIgnore
PeriodFormatter periodFormatter;
public Metrics() {
}
public DateTime getStartTimestamp() {
return startTimestamp;
}
public void setStartTimestamp(DateTime startTimestamp) {
this.startTimestamp = startTimestamp;
}
public DateTime getEndTimestamp() {
return endTimestamp;
}
public void setEndTimestamp(DateTime endTimestamp) {
this.endTimestamp = endTimestamp;
}
public Period getPeriod() {
return period;
}
public void setPeriod() {
this.period = new Period(this.startTimestamp, this.endTimestamp);
}
public void setPeriod(Period period) {
this.period = period;
}
public PeriodFormatter getPeriodFormatter() {
return periodFormatter;
}
public void setPeriodFormatter(PeriodFormatter periodFormatter) {
this.periodFormatter = periodFormatter;
}
@Override
public String toString(){
this.periodFormatter = new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours().appendSeparator(":")
.appendMinutes().appendSeparator(":")
.appendSeconds().appendSeparator(".")
.appendMillis3Digit()
.toFormatter();
return "Started: " + this.startTimestamp.toString() + "\\n" + "Ended: " + this.endTimestamp.toString() + "\\n" + "Response took: " + periodFormatter.print(period)+ "";
}
}
更新:
System.out.println(formatter.print(value))
in CustomDateSerializer
实际上打印了正确的字符串,但由于某种原因,它未能将其传递给我认为的序列化器。 ....
更新2
Controller
public @ResponseBody XmlResponse getGUID( @RequestParam(/*...*/) String environmentParam) {
//.... XmlResponse xmlResponse = ..........
return xmlResponse;
}
XmlResponse 类
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.IOException;
public class XmlResponse {
String xmlResponseBody;
@JsonIgnore
Metrics metrics;
Boolean error;
public XmlResponse() {
}
public XmlResponse(String xmlResponseBody, Metrics metrics, Boolean error) {
this.xmlResponseBody = xmlResponseBody;
this.metrics = metrics;
this.error = error;
}
public String getXmlResponseBody() {
return xmlResponseBody;
}
public void setXmlResponseBody(String xmlResponseBody) {
this.xmlResponseBody = xmlResponseBody;
}
@JsonProperty("metrics")
public Metrics getMetrics() {
return metrics;
}
public void setMetrics(Metrics metrics) {
this.metrics = metrics;
}
public Boolean getError() {
return error;
}
public void setError(Boolean error) {
this.error = error;
}
@Override
public String toString(){
String out = "";
ObjectMapper mapper = new ObjectMapper();
try {
// mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// mapper.registerModule(new JodaModule());
out = mapper.writeValueAsString(this);
} catch (JsonProcessingException e) {
e.printStackTrace();
return "{}";
} catch (IOException e) {
e.printStackTrace();
}
return out;
}
}
更新3
取消注释@JsonSerialize(using = CustomDateSerializer.class)
不会改变结果
最佳答案
您的代码是 Jackson 1.x (org.codehaus.jackson
) 和 Jackson 2.x (com.fasterxml.jackson
) 的混合体。虽然它们的 API 非常相似,但 Jackson 1.x 的注释对 Jackson 2.x 没有影响,反之亦然(除非您使用 jackson-legacy-introspector )。
确保您在各处使用相同的 Jackson 版本应该有助于解决您的问题。
您可以在那里获取更多信息:Upgrading Jackson 1.9 to 2.0 .
关于java - 自定义JodaTime序列化类返回大对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26860343/