在Spring Boot Application中更改对象的默认json

时间:2015-04-01 13:07:03

标签: java json spring spring-boot

  • 我有一个简单的Spring Boot应用程序,它有一个简单的MyDateTime模型类,只有一个带私有访问权限的java.util.Date实例变量,getters / setter和默认构造函数。

  • 控制器只是实例化此对象并返回。

  • 在输出中,我看到Date对象的默认表示是以整数形式完成的(也许是来自Epoch的毫秒)

  • 有什么方法可以将Date Object的默认jsonification更改为ISO-String或任何其他字符串吗?

编辑:

一些澄清:

我对Spring和Spring Boot非常陌生。我在春天的网站上使用了示例应用程序中的模板。 JSONification是通过Jackson完成的。休息一下,我对Spring一般都不太了解。

2 个答案:

答案 0 :(得分:4)

您可以设置杰克逊在序列化application.properties文件中的日期时使用的默认格式:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

http://docs.spring.io/spring-boot/docs/1.2.3.RELEASE/reference/htmlsingle/#common-application-properties

您还可以使用@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返回自定义类之外,我没有做任何其他事情。