【问题标题】:Changing default json for an object in Spring Boot Application在 Spring Boot 应用程序中更改对象的默认 json
【发布时间】:2015-06-06 03:39:00
【问题描述】:
  • 我有一个简单的 Spring Boot 应用程序,它有一个简单的 MyDateTime 模型类,只有一个 java.util.Date 实例变量,具有私有访问、getter/setter 和默认构造函数。

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

  • 在输出中,我看到 Date 对象的默认表示是一个整数(可能是来自 Epoch 的毫秒)

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

编辑:

一些说明:

我对 Spring 和 Spring Boot 很陌生。我正在使用 spring 网站上的示例应用程序中的模板。 JSON 化是通过 Jackson 完成的。休息一下,我一般对 Spring 了解不多。

【问题讨论】:

  • 你能分享一些代码吗?你如何打印你的 MyDateTime 模型?
  • 我没有打印任何东西。我只是有一个名为 SimpleController 的类,它实例化另一个类 MyDateTime 并返回它。
  • 这与 Spring Boot 有什么关系?何时/为什么/如何创建 JSON?你使用什么 JSON API?这个问题缺少回答它所需的任何必要信息。

标签: java json spring spring-boot


【解决方案1】:

Date.toString() 方法默认返回纪元时间戳。你想做的是关于杰克逊内部的。为此,请将您的 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);
    }

}

在序列化时,Jackson 寻找 getter 方法,即以get 开头的方法。如果您不想序列化某些内容,请从名称中删除 get。这是最简单的解决方案,您可以查看 Jackson API 以获取 @JsonIgnore 注释以获取更多解决方案。如果您想在 JSON 字符串中的字段名称中看到其他 date,请查找 @JsonProperty

要打印人类可读的日期,您需要SimpleDateFormat。 这些示例在我的设置上运行良好,除了从 HelloController 返回自定义类之外我没有做任何其他事情。

【讨论】:

    【解决方案2】:

    您可以设置 Jackson 在您的 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

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 2019-08-07
      • 1970-01-01
      相关资源
      最近更新 更多