Json序列化对于子类对象的处理
Lombok装饰子类
- lombok在装饰子类的时候默认不会启用父类的getter和setter方法,仅针对子类的属性开启getter和setter
- 如果需要连同父类一起开启getter和setter方法,需要添加**@EqualsAndHashCode**注解并指定参数 (callSuper=false)
上代码:
package com.example.spring_demo.dto;
import com.example.spring_demo.entity.Post;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper=false)
public class PostDTO extends Post {
//用户id
private Integer id;
//用户名字
private String username;
}
java子类对象序列化时会连同父类一起序列化
上面的类是post的子类,下面先展示post类源码
package com.example.spring_demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
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;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("post")
public class Post {
@TableId(type = IdType.AUTO)
private Integer id;
private String title;
private String body;
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime timestamp;
private Integer authorId;
//点赞
private Integer good;
}
使用mybatis去数据库查询然后返回后查看返回结果
下面是方法源码
public List<PostDTO> getPostAll() throws JsonProcessingException {
//查询所有post,创建一个集合并接收
//根据文章id查出作者name
List<PostDTO> list = postMapper.getPostAll();
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(list.get(0));
System.out.print("输出json:");
System.out.println(json);
return postMapper.getPostAll();
}
输出结果:
使用@JsonSerialize(using = LocalDateTimeSerializer.class)和@JsonDeserialize(using = LocalDateTimeDeserializer.class)两个注解完成对LocalDateTime的json序列化,并导入对应jackson依赖在pom中
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.12.3</version>
</dependency>
此时才可以对这个postDTO进行json序列化并输出查看
输出json:{"id":1,"title":"test","body":"111","timestamp":"2023-09-04 00:08","authorId":1,"good":null,"username":"caiyi"}
:“test”,“body”:“111”,“timestamp”:“2023-09-04 00:08”,“authorId”:1,“good”:null,“username”:“caiyi”}
而如果此时直接输出返回的list,是只能看到PostDTO里的两个属性的,Java屏蔽了父类对象,但实际上在返回ajax的时候,json序列化已经将PostDTO相关联的全部对象都序列化了出来并返回。