Spring Boot --- Spring MVC: Jackson


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

表示在一个静态方法上,表示反序列化时用该方法初始化对象

猜你喜欢

转载自blog.csdn.net/d292222100/article/details/81905560