阿里Fastjson:搞定json字符串转对象首字母大写的问题格式化日期显示时间戳的问题

tech2023-02-20  94

 

世界之大,无奇不有。

 

问题一:json字符串格式化成对象首字母大写的问题

 

虽然java规范明确规定字段名称首字母必须小写。但是实际开发中,总能遇到接口方强行定义成大写的情况。

针对这种特殊的业务场景,如何保证:

1,正常接收接口入参

2,符合java开发规范(字段名首字母小写)

答案是:使用阿里fastjson即可。思路是:使用注解@JSONField(name = "id"),假如接口传过来的字段名是:Name,

那我们可以这样来处理:

@JSONField(name = "Name") private String name;

我这里使用的版本是:fastjson-1.2.41-sources.jar。

 

问题二:JSON.toJSONString(str)对json进行格式化,日期格式显示时间戳的问题

 

另外FastJson还有一个需要注意的点:使用JSON.toJSONString(str)对json进行格式化时,

如果字段类型是Date,会转化成时间戳格式进行显示。

如何避免这种问题呢?答案是使用JSON.toJSONStringWithDateFormat(str, "yyyy-MM-dd HH:mm:ss");

如果字段类型是java8的LocalDateTime,是可以显示日期的。

 

package com.yangcq.learning.hantang.utils; import com.alibaba.fastjson.JSON; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j public class FastJsonUtils { public static void main(String[] args) { List<User> users = new ArrayList<>(); User user = new User(); user.setTime(LocalDateTime.now()); user.setDate(new Date()); users.add(user); // 运行结果:[{"date":1604286810174,"time":"2020-11-02T11:13:30.173"}] log.info("{}", JSON.toJSONString(users)); // 对java 6 Date进行格式化 // 运行结果:[{"date":"2020-11-02 11:15:48","time":"2020-11-02 11:15:48"}] log.info("{}", JSON.toJSONStringWithDateFormat(users, "yyyy-MM-dd HH:mm:ss")); // 运行结果有点出乎意料,toJSONStringWithDateFormat对所有日期进行了格式化, // 包括java 6 Date和java 8 LocalDateTime } } @Data class User { /** * java 8 LocalDateTime */ private LocalDateTime time; /** * java 6 Date */ private Date date; }

 

当然,也可以使用注解的方式来搞定,使用Fastjson提供的@JsonFiled注解,代码如下:

 

package com.yangcq.learning.hantang.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j public class FastJsonUtils2 { public static void main(String[] args) { List<UserDto> users = new ArrayList<>(); UserDto user = new UserDto(); user.setTime(LocalDateTime.now()); user.setDate(new Date()); users.add(user); // 运行结果:[{"date":"2020-11-02 11:43:43","time":"2020-11-02 11:43:43"}] log.info("{}", JSON.toJSONString(users)); } } @Data class UserDto { /** * java 8 LocalDateTime */ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private LocalDateTime time; /** * java 6 Date */ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date date; }

 

最新回复(0)