【问题标题】:How to return Java 'java.time.Instant' property as json value in Restful API body response?如何在 Restful API 正文响应中将 Java 'java.time.Instant' 属性作为 json 值返回?
【发布时间】:2017-07-06 10:01:26
【问题描述】:

我有一个 Spring Boot RESTful API 服务,它在其响应中返回一个 Java 对象,该对象被翻译成 json。

Java 对象属性之一是“Java.time.Instant”。我应该如何为返回的 json 对象翻译这个?

更新

我尝试过使用@JsonFormat 但这不起作用...

返回的 Java 对象具有“即时”属性...

 @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ",timezone = "UTC")
 public Instant getRequested() {
     return Requested;
}

这将在 json 响应正文中返回...

"requested": {
    "epochSecond": 1499342121,
    "nano": 868000000
},

我使用的是 Spring Boot 1.5.4

控制器方法是...

@RequestMapping(value="/", method= RequestMethod.POST)
public AcceptedAccountRequest newRequest(@RequestBody NewAccountRequest aRequest) {
AcceptedAccountRequest anAcceptedRequest = createAccepted(aRequest);
return anAcceptedRequest;
}

【问题讨论】:

  • 你可以使用.toEpochMilli,它得到一个长值。然后使用.ofEpochMilli 将其返回到 Instant 会更容易
  • 进一步了解这一点,普遍的看法似乎是使用 8601 格式返回所有 json 时间戳属性。使用“@jsonformat”注释是否是提供此服务的正确方式?
  • java.time.Instant 具有 ISO-8601 作为字符串表示,快速查看 API doc 也会发现这一点 - 只要您使用一些奇怪的,基于反射的序列化你很高兴。请使用谷歌。
  • 我尝试添加@JsonFormat,但生成的json无法识别...

标签: java spring rest java.time.instant


【解决方案1】:
  1. pom.xml 添加

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
    
  2. application.properties 添加

    spring.jackson.serialization.write-dates-as-timestamps=false
    

链接https://codeboje.de/jackson-java-8-datetime-handling/

【讨论】:

    【解决方案2】:

    解决了...我错过了 jsr310 maven 依赖项

    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
    

    关于澄清...如果我希望所有 Instant 属性都以 json 格式返回为 UTC,我应该使用以下格式指令,还是有另一种更好的方法...

    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ",timezone = "UTC")
    

    【讨论】:

    • 有一个更好的方法 - 将以下内容添加到您的 application.properties:spring.jackson.serialization.write_dates_as_timestamps=false
    【解决方案3】:

    您可以简单地使用java.time.Instant 来表示他们使用.toString() 如果您使用的是 Spring,则可能必须将 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 添加到 RestMethod 以确保正确转换

    【讨论】:

    • 我无法让它工作。无论我在返回的 json 中添加什么注释,都会遇到... "validUntil": { "epochSecond": 1499772556, "nano": 656000000 } .
    • 我使用的是 Spring Boot 1.5.4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2019-03-16
    • 2020-09-12
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多