世界之大,无奇不有。
问题一: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;
}