Java 格式化来自控制器的JSON响应中的日期
我返回一个JSON作为控制器的响应。我想格式化此响应中的日期字段 控制器-Java 格式化来自控制器的JSON响应中的日期,java,json,spring,date,hybris,Java,Json,Spring,Date,Hybris,我返回一个JSON作为控制器的响应。我想格式化此响应中的日期字段 控制器- @RequestMapping(value = "/call", method = RequestMethod.GET) public SampleDTO get() { ...... return sampleDTO; } { "date" : "2020-03-10T08:57:58+0000", "text" : "abc" } 采样到- @RequestMapping(value
@RequestMapping(value = "/call", method = RequestMethod.GET)
public SampleDTO get()
{
......
return sampleDTO;
}
{
"date" : "2020-03-10T08:57:58+0000",
"text" : "abc"
}
采样到-
@RequestMapping(value = "/call", method = RequestMethod.GET)
public SampleDTO get()
{
......
return sampleDTO;
}
{
"date" : "2020-03-10T08:57:58+0000",
"text" : "abc"
}
我想将日期字段格式化为dd-MM-yyyy
为此,我将@JsonFormat
注释添加到SampleDTO
的bean类中
SampleDTO.java-
import java.util.Date;
public class SampleDTO
{
@JsonFormat(pattern = "dd-MM-yyyy")
private Date date;
private String text;
@JsonFormat(pattern = "dd-MM-yyyy")
public void setDate(final Date date)
{
this.date = date;
}
@JsonFormat(pattern = "dd-MM-yyyy")
public Date getDate()
{
return date;
}
public void setText(final String text)
{
this.text = text;
}
public String getText()
{
return text;
}
}
尽管如此,我还是在浏览器的响应中得到了这种格式
“日期”:“2020-03-10T08:57:58+0000”
编辑1: 与其返回sampleDTO,不如在代码中将其直接转换为字符串 这就像一个符咒:
SampleDTO sampleDTO = new SampleDTO();
sampleDTO.setCreated(new Date());
ObjectMapper om = new ObjectMapper();
return om.writeValueAsString(sampleDTO);
请检查您的
Date
是否来自java.util
,而不是来自java.sql
包。另外,请尝试以下操作:
@JsonSerialize(as=Date.class)
@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“dd-MM-yyyy”)
请检查您的日期是否来自java.util
而不是java.sql
软件包。另外,请尝试以下操作:
@JsonSerialize(as=Date.class)
@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“dd-MM-yyyy”)
能否在字段级别尝试此操作,并从DTO中的getDate()
方法中删除
像这样的,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date date;
这应该适用于当前版本的jackson-databind:2.9.8.jar
下面是一个小例子:
public class ExampleMain {
public static void main(String[] args) throws IOException {
Employee employee = new Employee();
employee.setDateOfBirth(Date.from(ZonedDateTime.now().minusYears(30).toInstant()));
System.out.println("-- before serialization --");
System.out.println(employee);
System.out.println("-- after serialization --");
ObjectMapper om = new ObjectMapper();
String jsonString = om.writeValueAsString(employee);
System.out.println(jsonString);
System.out.println("-- after deserialization --");
System.out.println(om.readValue(jsonString, Employee.class));
}
}
public class Employee {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date dateOfBirth;
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Override
public String toString() {
return "Employee{" +
", dateOfBirth=" + dateOfBirth +
'}';
}
}
您是否可以在字段级别尝试此操作,并将其从DTO中的getDate()
方法中删除
像这样的,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date date;
这应该适用于当前版本的jackson-databind:2.9.8.jar
下面是一个小例子:
public class ExampleMain {
public static void main(String[] args) throws IOException {
Employee employee = new Employee();
employee.setDateOfBirth(Date.from(ZonedDateTime.now().minusYears(30).toInstant()));
System.out.println("-- before serialization --");
System.out.println(employee);
System.out.println("-- after serialization --");
ObjectMapper om = new ObjectMapper();
String jsonString = om.writeValueAsString(employee);
System.out.println(jsonString);
System.out.println("-- after deserialization --");
System.out.println(om.readValue(jsonString, Employee.class));
}
}
public class Employee {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private Date dateOfBirth;
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Override
public String toString() {
return "Employee{" +
", dateOfBirth=" + dateOfBirth +
'}';
}
}
Spring有三个级别可以解决这个日期格式问题
1)在日期字段中使用@JsonFormat
在这种情况下,您需要在所有私有日期成员前面使用相同的注释
public class MyBean{
@JsonFormat(pattern="yyyy-MM-dd")
private Date birthday;
@JsonFormat(pattern="yyyy-MM-dd")
private LocalDate birthday;
// getters and setters here
}
2)设置默认格式
如果要为应用程序中的所有日期配置默认日期格式,请在application.properties
或application.yml
配置文件中添加以下行:
spring.jackson.date-format=yyyy-MM-dd
不幸的是,此解决方案不适用于Java8日期类型,如LocalDate和LocalDateTime
3)自定义Jackson ObjectMapper
这个解决方案对于Java8日期类型也很有吸引力
@Configuration
public class ContactAppConfig {
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
builder.simpleDateFormat(DATE_TIME_FORMAT);
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
};
}
}
我建议您使用第三个选项。使用Spring解决此日期格式问题有三个级别
1)在日期字段中使用@JsonFormat
在这种情况下,您需要在所有私有日期成员前面使用相同的注释
public class MyBean{
@JsonFormat(pattern="yyyy-MM-dd")
private Date birthday;
@JsonFormat(pattern="yyyy-MM-dd")
private LocalDate birthday;
// getters and setters here
}
2)设置默认格式
如果要为应用程序中的所有日期配置默认日期格式,请在application.properties
或application.yml
配置文件中添加以下行:
spring.jackson.date-format=yyyy-MM-dd
不幸的是,此解决方案不适用于Java8日期类型,如LocalDate和LocalDateTime
3)自定义Jackson ObjectMapper
这个解决方案对于Java8日期类型也很有吸引力
@Configuration
public class ContactAppConfig {
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
builder.simpleDateFormat(DATE_TIME_FORMAT);
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
};
}
}
我建议您使用第三个选项。您可以使用jstl格式设置日期:)
您可以使用jstl格式格式化日期:)
两条建议:(1)不要使用Date
。那门课设计得很糟糕,而且早已过时。从中使用LocalDate
。(2) 在您的JSON使用格式中,所以yyyy-MM-dd
,而不是dd-MM-yyy
@OleV.V.:在最新版本的Hybris中,我到处都能看到Date
类。在我的JSON中,我有一个特定的要求以这种格式显示日期,所以我不能更改它。两个建议:(1)不要使用date
。那门课设计得很糟糕,而且早已过时。从中使用LocalDate
。(2) 在您的JSON使用格式中,所以yyyy-MM-dd
,而不是dd-MM-yyy
@OleV.V.:在最新版本的Hybris中,我到处都能看到Date
类。在我的JSON中,我有一个特定的要求以这种格式显示日期,所以我不能更改它。@Farrukh Chishti,上面应该可以,您使用的是什么版本的jackson-databind.jar?@MOnkey:我使用的是2.9。8@FarrukhChishti,上面的应该可以,你用的是什么版本的jackson-databind.jar?@MOnkey:我用的是2.9。8@Farrukh奇什蒂,尝试一下上面的更改。我已经做了建议的更改。从getter中删除注释并保持字段上的注释不变。不走运!在我的代码中,响应在后台自动解析。我没有明确使用任何映射器。我只是将响应返回为return sampleDTO
@Farrukh Chishti,尝试一下上面的更改。我已经做了建议的更改。从getter中删除注释并保持字段上的注释不变。不走运!在我的代码中,响应在后台自动解析。我没有明确使用任何映射器。我只是返回响应,因为returnsampledto
Approach#1不起作用。方法#2将导致系统范围内的更改,我不希望这样。我的代码库中缺少方法3:ClassJackson2ObjectMapperBuilderCustomizer
。谷歌是你的朋友:方法1不起作用。方法#2将导致系统范围内的更改,我不希望这样。方法#3:ClassJackson2ObjectMapperBuilderCustomizer
在我的代码库中缺失。Google是你的朋友:我只想更改Webservice调用的格式,即在postman中。我只想更改Webservice调用的格式,即在postman中