Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Boot中的JSON Java 8 LocalDateTime格式_Java_Json_Java 8_Spring Boot_Java Time - Fatal编程技术网

Spring Boot中的JSON Java 8 LocalDateTime格式

Spring Boot中的JSON Java 8 LocalDateTime格式,java,json,java-8,spring-boot,java-time,Java,Json,Java 8,Spring Boot,Java Time,我在Spring Boot应用程序中格式化Java8LocalDateTime时遇到了一个小问题。对于“正常”日期,我没有问题,但LocalDateTime字段转换为以下内容: "startDate" : { "year" : 2010, "month" : "JANUARY", "dayOfMonth" : 1, "dayOfWeek" : "FRIDAY", "dayOfYear" : 1, "monthValue" : 1, "hou

我在Spring Boot应用程序中格式化Java8LocalDateTime时遇到了一个小问题。对于“正常”日期,我没有问题,但LocalDateTime字段转换为以下内容:

"startDate" : {
    "year" : 2010,
    "month" : "JANUARY",
    "dayOfMonth" : 1,
    "dayOfWeek" : "FRIDAY",
    "dayOfYear" : 1,
    "monthValue" : 1,
    "hour" : 2,
    "minute" : 2,
    "second" : 0,
    "nano" : 0,
    "chronology" : {
      "id" : "ISO",
      "calendarType" : "iso8601"
    }
  }
而我想将其转换为如下内容:

"startDate": "2015-01-01"
我的代码如下所示:

@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
public LocalDateTime getStartDate() {
    return startDate;
}
"date": "2020-03-09 17:55:00"
但是上面的任何一个注释都不起作用,日期一直像上面那样格式化。欢迎您的建议

我终于找到了方法。要修复它,我需要另一个依赖项:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0")
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
通过包含此依赖项,Spring将自动为其注册一个转换器,如下所述。之后,您需要将以下内容添加到application.properties:

spring.jackson.serialization.write_dates_as_timestamps=false
这将确保使用正确的转换器,并以
2016-03-16T13:56:39.492的格式打印日期


只有在您想更改日期格式时才需要注释。

我添加了
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.1
依赖项,并开始以以下格式获取日期:

"birthDate": [
    2016,
    1,
    25,
    21,
    34,
    55
  ]
这不是我想要的,但我离得越来越近了。然后我添加了以下内容

spring.jackson.serialization.write_dates_as_timestamps=false
spring.jackson.serialization.write_dates_as_timestamps=false
指向application.properties文件,该文件为我提供了所需的正确格式

"birthDate": "2016-01-25T21:34:55"

在这里,它在maven中,具有属性,所以您可以在spring引导升级之间生存


com.fasterxml.jackson.datatype
jackson-datatype-jsr310
${jackson.version}
1)依赖关系

 compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.8' 
2) 日期时间格式的注释

public class RestObject {

    private LocalDateTime timestamp;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public LocalDateTime getTimestamp() {
        return timestamp;
    }
}
3) 弹簧配置

@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        System.out.println("Config is starting.");
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }
}

我找到了另一个解决方案,您可以将其转换为您想要的任何格式,并应用于所有LocalDateTime数据类型,而不必在每个LocalDateTime数据类型之上指定@JsonFormat。 首先添加依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
这将序列化和反序列化所有属性LocalDateTime和ZonedDateTime,只要您使用的是spring创建的objectMapper

ZoneDateTime的格式是:“2017-12-27T08:55:17.317+02:00[亚洲/耶路撒冷]” 对于LocalDateTime是:“2017-12-27T09:05:30.523”

这项工作很好:

添加依赖项:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0")
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
现在,您必须获得正确的格式

要使用对象映射器,需要注册JavaTime

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
@JsonDeserialize(使用=LocalDateDeserializer.class)
不适用于具有以下依赖项的我

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

写下这个答案也是为了提醒我

我在这里综合了几个答案,最后我的答案是这样的。 (我使用的是SpringBoot 1.5.7和Lombok 1.16.16)


如前所述,SpringBoot将获取您所需的一切(对于web和webflux starter)

但更好的是,您不需要自己注册任何模块。 看一看。由于
@SpringBootApplication
在引擎盖下使用
@EnableAutoConfiguration
,这意味着
JacksonAutoConfiguration
将自动添加到上下文中。 现在,如果您查看内部
JacksonAutoConfiguration
,您将看到:

    private void configureModules(Jackson2ObjectMapperBuilder builder) {
        Collection<Module> moduleBeans = getBeans(this.applicationContext,
                Module.class);
        builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
    }
专用void配置模块(Jackson2ObjectMapperBuilder){
Collection moduleBeans=getBeans(this.applicationContext,
模块(类);
builder.modulesToInstall(moduleBeans.toArray(新模块[0]);
}
将在初始化过程中调用,并将获取在类路径中可以找到的所有模块。
(我使用的是Springboot 2.1)

我使用的是Springboot 2.0.6,由于某种原因,应用程序yml的更改不起作用。 而且我还有更多的要求

我试着创建ObjectMapper并将其标记为Primary,但spring boot抱怨我已经将jacksonObjectMapper标记为Primary

这就是我所做的。 我对内部映射器进行了更改

我的序列化程序和反序列化程序是特殊的-它们处理'dd/MM/YYYY';在反序列化时,它会尽量使用3-4流行格式来确保我有一些LocalDate

@Autowired
ObjectMapper mapper;

@PostConstruct
public ObjectMapper configureMapper() {
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);

    mapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, true);
    mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);

    SimpleModule module = new SimpleModule();
    module.addDeserializer(LocalDate.class, new LocalDateDeserializer());
    module.addSerializer(LocalDate.class, new LocalDateSerializer());
    mapper.registerModule(module);

    return mapper;
}
只需使用:

@JsonFormat(pattern="10/04/2019")

或者,您可以使用您喜欢的模式,例如:
(“-”代替“/”)
我正在使用Spring Boot 2.1.8。我已经进口了


org.springframework.boot
spring启动程序json
其中包括jackson-datatype-jsr310

然后,我不得不添加这些注释

@JsonSerialize(使用=LocalDateTimeSerializer.class)
@JsonFormat(pattern=“yyyy-MM-dd HH:MM:ss”)
@JsonProperty(“日期”)
LocalDateTime getDate();
它是有效的。JSON如下所示:

@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
public LocalDateTime getStartDate() {
    return startDate;
}
"date": "2020-03-09 17:55:00"

这对我有用

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
public Class someClass {

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime sinceDate;

}

增加

进入gradle编译块

application.yml
文件中

spring:
  jackson:
    serialization:
      write_dates_as_timestamps: false
如果您使用的是
application.properties
文件 添加以下内容

spring.jackson.serialization.write_dates_as_timestamps=false
spring.jackson.serialization.write_dates_as_timestamps=false
如果要应用自定义格式,可以应用注释

    @JsonFormat(pattern = "yyyy-MMMM-dd hh:mm:ss")
    private LocalDateTime date;
它开始对我起作用了

这对我起作用了

我在DTO中定义了生日字段,如下所述:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime birthDate;
在我的请求正文中,我以以下格式传递了生日:

{
   "birthDate": "2021-06-03 00:00:00"
 }

可能值得包括以下注释-
@JsonSerialize(using=LocalDateTimeSerializer.class)
…最好只使用一个
应用程序.properties
条目,正如@patelb answer所建议的那样。不起作用。但是patelib的答案是现成的!作为提示,我们需要尼克提到的
@JsonSerialize
注释才能让它工作。在我的例子中,这起作用了:
@JsonSerialize(using=LocalDateSerializer.class)
@JsonFormat(pattern=“yyyy-MM-dd”)
,没有新的依赖项和属性。当包含
jackson-datatype-jsr310
依赖项时,可以开箱即用。这应该是可以接受的答案。仅供参考,如果您使用以下配置对象映射器:
mapper.configure(SerializationFeature.WRITE_DATES_As_TIMESTAMPS,false),则application.properties部分可以通过Java config完成:可能需要将val bean替换为SimpleModule bean=new SimpleModule();这是f吗