首页 > 其他分享 >如何解决LocalDateTime传值JSON格式化问题

如何解决LocalDateTime传值JSON格式化问题

时间:2023-11-08 23:01:16浏览次数:31  
标签:格式化 MM pattern dd yyyy JSON LocalDateTime 传值

  • LocalDateTime传值JSON格式化问题
  • 推荐方法
  • 其它方法
  • LocalDateTime的json格式化问题
  • 解决方式一
  • 解决方式二


LocalDateTime传值JSON格式化问题

LocalDateTime是JDK8中提供的新功能,极大的优化了原生日期时间类的使用。

但是第一次使用该类可能会在传值过程中出现格式化的小问题(如:JSON无法解析前端所传格式,序列化时LocalDateTime成为数组等),以下提供简单的解决方案。


推荐方法

在WebMvcConfigurer实现类下完成以下两步

1).注册一个Converter实现类,其作用是处理于url所携带的参数上(如:@RequestParam、@PathVariable )的LocalDateTime参数;

2).增加一个序列化、反序列化器,作用为处理实体类的的LocalDateTime属性。

P.S.经过多轮测试,得出了以上方法,由于该方法需要以上两个步骤,作为完美主义者,我曾尝试用一个步骤解决,但并未如愿以偿,若你有更好的方法,还望不吝赐教,先行谢过。

源码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

// import ...

@Configuration

@EnableWebMvc

public

class

WebMvcConfig

implements

WebMvcConfigurer {



/**


* 自定义String转LocalDateTime方法,此方法将会作用于url所携带的参数上


*/


static

class

StringToLocalDateTimeConverter

implements

Converter {


@Override


public

LocalDateTime convert(String s) {


DateTimeFormatter formatter = DateTimeFormatter.ofPattern(

"yyyy-MM-dd HH:mm:ss"

);


return

LocalDateTime.parse(s, formatter);


}


}


/**


* 将上述自定义方法进行添加


*/


@Override


public

void

addFormatters(FormatterRegistry registry) {


registry.addConverter(

new

StringToLocalDateTimeConverter());


}



/**


* 增加序列化与反序列化器,它们将作用于实体类的LocalDateTime属性。


*/


@Override


public

void

configureMessageConverters(List> converters) {


DateTimeFormatter pattern = DateTimeFormatter.ofPattern(

"yyyy-MM-dd HH:mm:ss"

);


ObjectMapper objectMapper =

new

ObjectMapper();


JavaTimeModule module =

new

JavaTimeModule();


module.addSerializer(LocalDateTime.

class

,

new

LocalDateTimeSerializer(pattern));


module.addDeserializer(LocalDateTime.

class

,

new

LocalDateTimeDeserializer(pattern));


objectMapper.registerModule(module);


converters.add(

new

MappingJackson2HttpMessageConverter(objectMapper));


}

}


其它方法

url参数:

给参数加上@DateTimeFormat(此注解来自Spring,无需引入其他包),在pattern中标注约定好的格式即可。

1

2

3

public

void

Test(

@RequestParam

@DateTimeFormat

(pattern =

"yyyy-MM-dd HH:mm:ss"

) LocalDateTime time) {


...

}

实体类:

在实体类中的属性上添加@JsonFormat(此注解来自Jackson,该包被Spring所依赖,无需导入),同样在pattern中标注好格式。

1

2

3

4

5

6

@Data

public

class

Demo {


@JsonFormat

(pattern =

"yyyy-MM-dd HH:mm:ss"

)


private

LocalDateTime time;


}

由于这种方法需要对代码中所有的LocalDateTime都进行标注,相对麻烦,且耦合度高,所以不作推荐。


LocalDateTime的json格式化问题

LocalDateTime 的 json 格式化存在问题如图所示:


解决方式一

添加json格式化配置文件:

1

2

3

4

5

6

7

8

9

10

11

12

@Configuration

public

class

LocalDateTimeSerializerConfig {


@Value

(

"${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}"

)


private

String pattern;


public

LocalDateTimeSerializer localDateTimeDeserializer() {


return

new

LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));


}


@Bean


public

Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {


return

builder -> builder.serializerByType(LocalDateTime.

class

, localDateTimeDeserializer());


}

}


解决方式二

@JsonFormat 注解

上面的方案全局生效,当全局的格式化方式无法满足我们需求时,我们对日期格式要做特殊的处理:在类的属性上添加注解

1

2

3

@JsonFormat

(pattern =

"yyyy-MM-dd"

)

@ApiModelProperty

(value =

"创建时间"

)

private

LocalDateTime createTime;

加上效果后:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

标签:格式化,MM,pattern,dd,yyyy,JSON,LocalDateTime,传值
From: https://blog.51cto.com/u_16274468/8261484

相关文章

  • LocalDateTime兼容日期格式
    LocalDateTime兼容日期格式触发场景:在工作中要接收前端传递的时间类型的数据,我默认设置的是接收"yyyy-MM-ddHH:mm:ss"格式的数据,例如:“recordTime”:“2018-12-2513:10:45”,但是因为我设置的格式原因,当前端传递的参数格式为"recordTime":"2018-12-313:10:45"时,则会报错。为了兼......
  • PowerShell 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth o
    问题描述创建PowerShellAzureDurableFunction,执行大量的PowerShell脚本操作AzureResource,遇见了一个非常非常奇怪的问题:Function'Hello1(Activity)'failedwithanerror.Reason:Newtonsoft.Json.JsonReaderException:Thereader'sMaxDepthof64hasbeenexceeded.Pa......
  • 【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReade
    问题描述创建PowerShellAzureDurableFunction,执行大量的PowerShell脚本操作AzureResource,遇见了一个非常非常奇怪的问题:Function'Hello1(Activity)'failedwithanerror.Reason:Newtonsoft.Json.JsonReaderException:Thereader'sMaxDepthof64hasbeenexceeded.......
  • Java中的传值和传引用
    三年以前读研究生的时候,就因为传值和传引用的问题给自己挖过一个坑情景是,我将matlab代码翻译到java中最后计算的结果偏差超过了限差的范围,也超过了java中数据截断误差的范围。经过最后的排查发现,在计算的过程中,一个不应该改变的值被我以引用的形式传入了方法中,方法内部对值进行......
  • gjson
    1.通配符‘#’1.1例子在gjson中,井号#是一个通配符,用于匹配JSON数组中的所有元素。在你的查询中,#用于匹配NetworkAdapterComplexes数组中的每个元素,然后继续沿着JSON结构的路径。让我们解释你的查询的各个部分:NetworkAdapterComplexes.#:这部分使用#通配符,匹配......
  • @RequestBody接收Json参数 用自定义注解对Vo对象中Date类型日期格式校验
    @RequestBody接收Json参数|用自定义注解对Vo对象中Date类型日期格式校验问题描述昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题。要求输入的日期格式是:yyyy-MM-ddHH:mm:ss,Vo中使用的注解如下:@DateTimeFormat(pattern=”yyyy-MM-ddHH:mm:ss”)测试同事输入下面两种......
  • LocalDateTime与String之间的转换
    LocalDateTime类型转换String类型publicstaticvoidmain(String[]args){DateTimeFormatterfmt=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");LocalDateTimelocalDateTime=LocalDateTime.now();StringdateStr=localDateTime.format(fmt);System.out.p......
  • 记录日志文件 日志文件的内容以Json格式保存到txt文件中
    封装一个方法,传不同的参数,记录不同类型的日志文件,并将大的日志内容,以Json的格式,保存值txt日志文件1.记录操作日志1//记录操作日志2varKeyWord="导入->编辑预算";3newLogService(AccountId).CreateBudgetLog(Common.JsonHelper.ObjToJ......
  • [JSON] Fastjson 之版本对比:Fastjson vs Fastjson2
    1Fastjson21.1简述FASTJSON相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。Fastjson2相对Fastjson1版本可以说是一次完全重构。这里从代码的角度,分析两者的一些区别;并总结一些新的,让小伙伴们使用Fastjson2或者进......
  • 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为
    一个报表的查询,用ajax调用的Service,查询条件没有问题,后台也能返回数据,就一直返回Error提示,F12看到是因为返回json时出错了 在web.config的configuration加以下代码即可解决<system.web.extensions><scripting><webServices><jsonSerializationmaxJs......