我有一个简单的Spring Boot应用程序,它有一个简单的MyDateTime模型类,只有一个带私有访问权限的java.util.Date实例变量,getters / setter和默认构造函数。
控制器只是实例化此对象并返回。
在输出中,我看到Date对象的默认表示是以整数形式完成的(也许是来自Epoch的毫秒)
有什么方法可以将Date Object的默认jsonification更改为ISO-String或任何其他字符串吗?
编辑:
我对Spring和Spring Boot非常陌生。我在春天的网站上使用了示例应用程序中的模板。 JSONification是通过Jackson完成的。休息一下,我对Spring一般都不太了解。
答案 0 :(得分:4)
您可以设置杰克逊在序列化application.properties
文件中的日期时使用的默认格式:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
您还可以使用@JsonFormat
注释指定要用于特定日期的特定格式,例如:
示例POJO:
public class Demo {
private Date timestamp1;
private Date timestamp2;
public Date getTimestamp1() {
return timestamp1;
}
public void setTimestamp1(Date timestamp1) {
this.timestamp1 = timestamp1;
}
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public Date getTimestamp2() {
return timestamp2;
}
public void setTimestamp2(Date timestamp2) {
this.timestamp2 = timestamp2;
}
}
示例控制器:
@RestController
public class DemoController {
@RequestMapping(value="/demo", method = RequestMethod.GET)
Demo start() {
Demo demo = new Demo();
Date timestamp = new Date();
demo.setTimestamp1(timestamp);
demo.setTimestamp2(timestamp);
return demo;
}
}
https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations
答案 1 :(得分:0)
Date.toString()
方法默认返回epoch时间戳。你想做的是关于杰克逊的内部。要实现这一点,请将MyDateTime
类更改为以下内容:
public class MyDateTime {
private final Date date;
public MyDateTime(Date date) {
this.date = date;
}
public Date date() { //this is not read by Jackson
return date;
}
public String getDate() { //this is read by Jackson
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
return formatter.format(date);
}
}
在序列化时,杰克逊会寻找以get
开头的getter方法。如果您不想要序列化某些内容,请从名称中删除get
。这是最简单的解决方案,您可以检查Jackson API以获取@JsonIgnore注释,以获得更多解决方案。如果您想在JSON字符串中查看字段名称中的其他date
,请查找@JsonProperty。
要打印人类可读日期,您需要SimpleDateFormat
。
这些示例在我的设置上运行正常,除了从HelloController
返回自定义类之外,我没有做任何其他事情。