Jackson
的使用
Jackson
使用ObjectMapper
对象来进行序列化与反序列化
ObjectMapper mapper = new ObjectMapper();
//将对象序列化
String json = mapper.writeValueAsString(entity);
//反序列化为Map
Map<?, ?> map = mapper.readValue(json, Map.class);
//反序列化为对象
User u = mapper.convertValue(map,User.class);
ObjectMapper
的获取
在Spring Boot
中,已提供Object Mapper Bean
,也可自定义Object Mapper Bean
@Autowired
ObjectMapper mapper;
ObjectMapper
配置
@Bean
public ObjectMapper mapper(){
ObjectMapper mapper = new ObjectMapper();
/* null值的字段不进行序列化 */
mapper.setSerializationInclusion(Include.NON_NULL);
return mapper;
}
ObjectMapper的参数
ObjectMapper的参数,可以在对象中使用setXXX()
,也可以在配置文件中配置spring.jackson.xxx
进行设置
SerializationInclusion
序列化规则
- 可选值
值 | 说明 |
---|---|
ALWAYS |
|
NON_NULL |
不能未空, 为null值的字段不进行序列化 |
NON_ABSENT |
|
NON_EMPTY |
null或”“的指端不进行序列化 |
NON_DEFAULT |
默认值不进行序列化 |
CUSTOM |
|
USE_DEFAULTS |
DateFormat
时间的现实格式
TimeZone
设置时区
ObjectMapper过滤器
FilterProvider提供序列化前的自定义拦截器
FilterProvider实现类
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.PropertyFilter;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
@JsonFilter("jacksonFilter")
public class JacksonFilter extends FilterProvider {
@Override
public BeanPropertyFilter findFilter(Object o) {
throw new UnsupportedOperationException("Access to deprecated filters not supported");
}
@Override
public PropertyFilter findPropertyFilter(Object filterId, Object valueToFilter) {
return new SimpleBeanPropertyFilter(){
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception {
if(writer.getName().equals("id")){
writer.serializeAsField(pojo, jgen, provider);
}else{
writer.serializeAsOmittedField(pojo, jgen, provider);
}
}
};
}
}
定义一个FilterProvider
的实现类.
其中findPropertyFilter
方法.返回SimpleBeanPropertyFilter
实例,实例中的serializeAsField
自定义pojo实体中每个field是否进行序列化
使用FilterProvider
@Autowired
ObjectMapper objectMapper;
@Autowired
JacksonFilter jacksonFilter;
//添加拦截器
objectMapper.setFilterProvider(jacksonJsonFilter);
//定义哪些实体类使用该拦截器(如果实体类中含有对象属性,则该对象的类也需要加入)
objectMapper.addMixIn(rootClazz, jacksonJsonFilter.getClass());
注解
JsonIgnore
在字段或方法上,用来完全忽略被注解的字段(方法对应的属性),即便这个字段(方法)满足被检测的条件或还有其他注解(优先级高于其他注解).
JsonProperty
在字段或方法上,用来对属性的序列化/反序列化.可以用来避免遗漏属性.同时提供对属性的重命名.
例如默认情况下jackson不会序列化private且无getter方法的属性,但加上JsonProperty后,可直接设定将该属性序列化/反序列化.
JsonIgnoreProperties
作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉,可以将它看作是@JsonIgnore的批量操作,但功能比之更强大.
想忽略的属性列表如@JsonIgnoreProperties({“name”,”sex})
过滤掉未知属性不抛错@JsonIgnoreProperties(ignoreUnknown = true)
JsonUnwrapped
作用在属性字段或方法上,用来将JSON对象的属性添加到封闭的JSON对象.
public class Address {
private String provinces;
private String city;
private String street;
//setter and getter and constructor
}
public class User {
private Long id;
private String name;
private Boolean sex;
private Address address;
//setter and getter and constructor
}
{"id":1,"name":"yucoang","sex":true,"address":{"provinces":"福建省","city":"厦门市","street":"长浩一里"}}
public class User {
private Long id;
private String name;
private Boolean sex;
@JsonUnwrapped
private Address address;
//setter and getter and constructor
}
{"id":1,"name":"yucoang","sex":true,"provinces":"福建省","city":"厦门市","street":"长浩一里"}
@JsonUnwrapped拥有prefix和suffix,用来对字段添加前后缀
@JsonUnwrapped(prefix = "address_", suffix = "_value")
private Address address;
{"id":1,"name":"yucoang","sex":true,"address_provinces_value":"福建省","address_city_value":"厦门市","address_street_value":"长浩一里"}
JsonFormat
格式化Date对象的数据
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.sss")
private Date date;
{"date":"2018-02-24 07:39:08.008"}
JsonValue
该注解只能标识在类中唯一一个方法上,表示序列化时用当前方法替换本对象.
public class User {
private Long id;
private String name;
private Address address;
/* Setting and Getting */
}
public class Address {
Long id;
String address;
Long createTime;
@JsonValue
public String getAddress() {
return address;
}
/* Setting and Getting */
}
在Address的getting上设置@JsonValue后,序列化User对象,address属性将不再是对象而是getting得到的值
{"id":1,"name":"yucoang","address":{"id":1,"address":"北京","createTime":100}}
{"id":1,"name":"yucoang","address":"北京"}
JsonInclude
该注解放在属性上,该属性符合规则便不参与序列化
放在类上,则全部属性都起作用
Include.ALWAYS
Include.NON_DEFAULT
Include.NON_EMPTY
Include.NON_NULL
JsonSerialize和JsonDeserialize
作用于对象字段或方法上,指定序列化/反序列化的实现,通常对某一种类型的自定义序列化/反序列化时用到.
@JsonSerialize(using = AddressJsonSerializer.class)
private Address address;
public class AddressJsonSerializer extends JsonSerializer<Address> {
@Override
public void serialize(Address address, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
String addressValue = String.format("%s_%s_%s",address.getProvinces(),address.getCity(),address.getStreet());
jsonGenerator.writeString(addressValue);
}
}
{"id":1,"name":"yucoang","sex":true,"address":"福建省_厦门市_长浩一里","date":"2018-02-24 07:50:30.030"}
JsonPropertyOrder
作用在类上,用来指明当序列化时需要对属性做排序.
//先显示id,name,其他字段再按字母顺序排序
@JsonPropertyOrder(alphabetic = true,value = {"id","name"})
该属性还具有alphabetic
属性,是否采用字母拼音顺序作为排序,默认false
JsonView
视图模版,用来指定哪些属性可以包含在JSON视图中.
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
@JsonView( ForAdd.class)
private String name;
@JsonView(ForAdd.class)
private Integer age;
@JsonView({ForAdd.class, ForUpdate.class})
@JsonIgnore
private Boolean sex;
@JsonView({ForAdd.class, ForUpdate.class})
private LocalDate birthday;
@JsonView({ForAdd.class, ForUpdate.class})
@JsonIgnoreProperties({"id","city"})
private Address address;
public interface ForAdd{}
public interface ForUpdate{}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {
@JsonView({User.ForUpdate.class})
private Long id;
@JsonView({User.ForUpdate.class})
private String provinces;
@JsonView({User.ForUpdate.class})
private String city;
@JsonView({User.ForUpdate.class})
private String stream;
}
使用
String value = objectMapper.writerWithView(User.ForUpdate.class).writeValueAsString(user);
@GetMapping
@JsonView(User.ForUpdate.class)
public List<User> findAll(){
...
}
JsonFilter
JsonCreator
表示在一个静态方法上,表示反序列化时用该方法初始化对象