springboot自定义json格式转换 | 张扎瓦的博客

springboot自定义json格式转换

最近在看JDK8的新功能,在项目中使用了新的时间API,结果却引发了一个问题,本篇文章详细介绍了问题的出现以及解决方法。


错误的出现

web项目中,我们常常会定义实体类,来对应数据库的表。

1
2
3
4
5
6
7
8
9
10
public class User implements Serializable {

private Integer id;

private String name;

private String password;

private Instant created;
}

在上面的实体类中,我使用了JDK8中新的API java.time.Instant来替代java.util.Date类。经过测试后,可以使用mybatis正常操作数据库。但当写接口返回json时,created字段原本应该返回时间戳,但却返回成了浮点数。

1
"created":1522234791.000000000

解决办法

Instant中是由toEpochMilli()方法转为时间戳的,我们可以自定义一个JsonSerializer来进行转换。

1
2
3
4
5
6
7
public class InstantConverter extends JsonSerializer<Instant> {

@Override
public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.toEpochMilli());
}
}

定义完成后,需要在指定的属性上加@JsonSerialize(using = 自定义转换方法.class),来标注。这样当返回json数据时,会自动调用我们的方法进行格式转换。

修改后的实体类

1
2
3
4
5
6
7
8
9
10
11
public class User implements Serializable {

private Integer id;

private String name;

private String password;

@JsonSerialize(using = InstantConverter.class)
private Instant created;
}
如果我的文章对您有所帮助,不妨打赏一杯豆浆以资鼓励(○` 3′○)