@JsonIgnoreProperties(value = { "prop1","prop2" })用来修饰Pojo类, 在序列化和反序列化的时候忽略指定的属性, 可以忽略一个或多个属性.
@JsonIgnoreProperties(ignoreUnknown = true)用来修饰Pojo类, 在反序列化的时候忽略那些无法被设置的属性, 包括无法在构造子设置和没有对应的setter方法.
@JsonInclude注解的作用是指定实体类在序列化时的策略,在实体类序列化成json的时候在某些策略下,加了该注解的字段不去序列化该字段。例如,返回前端的实体类中如果某个字段为空的话那么就不返回这个字段了。
参数主要有:
- ALWAYS:表示总是序列化所有属性
- NON_NULL:表示序列化非null属性
- NON_ABSENT:表示序列化非null或者引用类型缺省值,例如java8的Optional类,这个选中通常与Optional一起使用
- NON_EMPTY:表示序列化非Empty的属性,例如空的集合不会被序列化
- NON_DEFAULT:仅包含与POJO属性默认值不同的值
- CUSTOM:由{@link JsonInclude#valueFilter}指定值本身,或由{@link JsonInclude#contentFilter}指定结构化类型的内容,由过滤器对象的equals方法进行序列化,返回true则会被排除,返回false会被序列化
- USE_DEFAULTS:使用默认值
@JsonFormat
@JsonFormat可以完成格式转换。例如对于Date类型字段,如果不适用JsonFormat默认在rest返回的是long,如果使用@JsonFormat(timezone = “GMT+8”, pattern = “yyyy/MM/dd HH:mm:ss”),就返回"2020/07/29 09:58:15"
@JsonIgnore注解用来忽略某些字段,可以用在变量或者Getter方法上,用在Setter方法时,和变量效果一样。这个注解一般用在要忽略的字段上。用在属性和方法上,效果是一样的,都会屏蔽掉get、set方法 。这个注解只能用在POJO存在的字段要忽略的情况,不能满足现在需要的情况。
如果 json field 的名称和Pojo 的属性名不一致的时, 可以用 @JsonProperty 来注解 getter() 或 setter() 方法, 该注解设定json 对应的属性名, 另外@JsonProperty也经常用来注解构造子的形参, 这时候构造子应该加@JsonCreator 注解.
如果 Pojo 类定义有参数的构造子, 但没有提供无参构造子时, 在反序列化时是会报错. 有下面两个办法:
如果 json field 的名称和Pojo 的属性名不一致的时, 可以使用@JsonGetter来注解 getter(), 使用 @JsonSetter 来注解setter() 方法. 这两个注解都可以指定一个属性名. 这两个注解都可以用 @JsonProperty 替换.
一般对象属性名都是确定的, 比如 Person这个对象, 有 name/age等具名属性, 但有时候我们还需要为Person这个对象设定一些扩展属性, 这些扩展属性名称暂时不好确定, 通常使用 Map
public class Person {
public String name;
private Integer age;
private Map properties;
@JsonAnySetter
public void add(String key, String value) {
properties.put(key, value);
}
}
和@JsonAnySetter 注解相对应, 如果要将类中的Map K/V属性序列化到json中, 需要在类上增加一个 @JsonAnyGetter 方法, 该方法直接返回KV map就行.
public class Person {
public String name;
private Integer age;
private Map properties;
@JsonAnyGetter
public void add(String key, String value) {
properties.put(key, value);
}
}
@JsonSerialize注解可以为类属性设定专门的序列化函数, @JsonDeserialize注解用来为json属性定制化反序列化函数。比如,对于一些敏感性的数据如手机号,姓名等。我们需要做加密传输。
SpringMVC默认的JSON框架为jackson,也可以使用fastjson。
jackson框架的自定义序列化:
1. 自定义的属性json化需要自定义JsonSerializer的实现类.如:
public class EncryptSerializer extends JsonSerializer {
@Override
public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//数据加密
jsonGenerator.writeString(RSAUtils.encryptByPriKey(value));
}
}
2. jackson的反序列化:
/**
* 自定义序列化
**/
public class DecryptDeserializer extends JsonDeserializer {
@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
retrun RSAUtils.decrypt(jp.getText());
}
}
如果使用的是fastjson。则需要使用ObjectSerializer和ObjectDeserializer
fastjson使用的是 @JSONField类参数化数据
com.alibaba
fastjson
class RSADeserializer implements ObjectDeserializer,ObjectSerializer{
/*@Override
public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String val = (String) parser.parse();
return (String)RSAUtils.decrypt(val);
}*/
public String deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String val = (String) parser.parse();
return RSAUtils.decrypt(val);
}
@Override
public int getFastMatchToken() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void write(JSONSerializer serializer, Object object,Object fieldName, Type fieldType, int features)
throws IOException {
serializer.write(RSAUtils.encrypt(object));
}
}