参考资料
- Jackson使い方メモ
目录
- 一. @JsonIgnore
- 二. @JsonIgnoreProperties
- 三. @JsonProperty
- 3.1 作用于entity属性上,指定json对象属性名
- 3.2 作用于entity方法上,指定json对象属性名
- 四. @JsonFormat
- 4.1 日期格式化
- 4.2 数字格式化
- 4.3 枚举类返回code
- 五. @JsonCreator注解 枚举类接收前台提交数据
- 5.1 枚举类和接收数据entity的定义
- 5.2 后台枚举类接收前台的数据
- 5.3 后台枚举类型的数据返回给前台
- 六. @JsonAlias
- 七. @JsonInclude
一. @JsonIgnore
- 在序列化和反序列化 JSON 数据时,忽略指定的属性。
import com.fasterxml.jackson.annotation.*;
import lombok.Data;
@Data
public class Test34Entity {
@JsonIgnore
private String id;
private String name;
private String content;
}
- 返回数据给前台
@PostMapping("/get_data")
public ResponseEntity<Test34Entity> getData(@RequestBody Test34Entity data) {
Test34Entity entity = new Test34Entity();
// 在此处设定了id属性
entity.setId("1355930");
entity.setName("贾飞天");
entity.setContent("内容");
return ResponseEntity.ok(entity);
}
⏹由于给id属性添加了@JsonIgnore
注解,所以id并没有返回给前台。
二. @JsonIgnoreProperties
- 同时指定多个需要忽略的属性
import com.fasterxml.jackson.annotation.*;
import lombok.Data;
@Data
@JsonIgnoreProperties({"id", "content"})
public class Test34Entity {
private String id;
private String name;
private String content;
}
⏹可以看到,因为id和content属性被忽略,所以只有name属性被返回到了前台。
三. @JsonProperty
3.1 作用于entity属性上,指定json对象属性名
⏹由下图可知,当前台json的属性值和后台实体类属性值不匹配时,可使用@JsonProperty指定
3.2 作用于entity方法上,指定json对象属性名
⏹部分属性值,后台需要根据既存的属性经过业务判断处理后返回前台,且该属性值最终只有前台需要,后台的业务逻辑中并不需要,此时可以将@JsonProperty
注解作用于方法上,用来指定该属性
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.Optional;
@Data
public class Test34Entity {
private String firstName;
private String lastName;
// 后台不需要该属性,只有前台才需要此属性
// private String fullName;
// 指定该方法的返回值作为json的属性,属性名为fullname
@JsonProperty("fullName")
private String getFullName() {
return Optional.ofNullable(this.firstName).orElse("") + Optional.ofNullable(this.lastName).orElse("");
}
}
⏹如下图所示,在返回给前台的时候,fullName
也被返回。
四. @JsonFormat
4.1 日期格式化
- 在Date和YearMonth属性上指定日期字符串的格式
import com.fasterxml.jackson.annotation.*;
import lombok.Data;
import java.time.YearMonth;
import java.util.Date;
@Data
public class Test34Entity {
@JsonFormat(pattern = "yyyy/MM/dd")
private Date birthday;
@JsonFormat(pattern = "yyyy/MM")
private YearMonth yearMonth;
}
⏹由下图可知,日期字符串转换为java实体类中的日期属性类型
4.2 数字格式化
- 指定序列化时的数据类型(返回前台的数据类型)
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Test34Entity {
// 指定序列化时的数据类型是字符串
@JsonFormat(shape = JsonFormat.Shape.STRING)
private BigDecimal num1;
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Integer num2;
// 未指定序列化时的数据类型
private BigDecimal num3;
private Integer num4;
}
⏹可以看到,指定了 @JsonFormat(shape = JsonFormat.Shape.STRING)
注解的属性,返回前台时的数据类型变为字符串类型。
4.3 枚举类返回code
详情请参考 5.3 后台枚举类型的数据返回给前台
五. @JsonCreator注解 枚举类接收前台提交数据
5.1 枚举类和接收数据entity的定义
⏹定义一个枚举类
- Jackson根据
@JsonCreator
注解所作用的枚举类中的方法,将前台提交的数据转换为枚举类对象 fromName
方法只是为了根据枚举类的name获取枚举类对象,和枚举类序列化反序列化没有关系
import com.fasterxml.jackson.annotation.JsonCreator;
import java.util.Arrays;
public enum SexTypes {
男性("1"),
女性("2"),
保密("3");
private String code;
SexTypes(String code) {
this.code = code;
}
public String getCode() {
return code;
}
/*
根据code获取枚举类对象
SpringBoot在将前台数据封装的时候,通过@JsonCreator注解对应的方法
指定前台的性别code转换为对应的枚举类
*/
@JsonCreator
public static SexTypes fromCode(String code) {
return Arrays.stream(SexTypes.values())
.filter(item -> item.code.equals(code)).findAny().orElse(null);
}
public static SexTypes fromName(String name) {
return Arrays.stream(SexTypes.values())
.filter(item -> item.name().equals(name)).findAny().orElse(null);
}
}
⏹用来接收前台提交到后台数据的entity
import com.example.jmw.common.enums.SexTypes;
import lombok.Data;
@Data
public class Test34Entity {
private String id;
// 自定义的枚举类
private SexTypes sexTypes;
}
5.2 后台枚举类接收前台的数据
5.3 后台枚举类型的数据返回给前台
⏹在不做任何配置的情况下,默认返回前台的数据是枚举类的名称
⏹在枚举类上配置@JsonFormat(shape = JsonFormat.Shape.OBJECT)
,返回给前台的是枚举类的code
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexTypes {
男性("1"),
女性("2"),
保密("3");
// ...以下代码省略...
@JsonCreator
public static SexTypes fromCode(String code) {
return Arrays.stream(SexTypes.values())
.filter(item -> item.code.equals(code)).findAny().orElse(null);
}
}
⏹效果如下所示,返回的是枚举类的code
六. @JsonAlias
- 作用于实体类的属性上
- 被标记的属性可以同时接受多个指定的key
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data;
@Data
public class Test34Entity {
// id 和 userId 都将被封装到此处
@JsonAlias({"userId"})
private String id;
@JsonAlias({"userName"})
private String name;
}
⏹效果如下所示,前台json中的key是userId,后台entity的属性值是id,但是通过@JsonAlias
注解指定了别名userId,所以成功接受到数据。
七. @JsonInclude
JsonInclude.Include.NON_NULL
:指定返回的数据中仅包含非null的数据
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test34Entity {
private String id;
private String name;
private String content;
}
⏹由下图可知,content属性为null,但是因为通过@JsonInclude(JsonInclude.Include.NON_NULL)
的指定,所以值为null的属性压根就没有返回到前台。