jackson 常用注解

@JsonPropertyOrder({ "name", "id" })
指定 序列化属性的顺序

@JsonPropertyOrder(alphabetic=true)
按字母顺序对属性进行排序

@JsonRawValue
属性 注释可以 指示 Jackson 完全按原样序列化 。
这个注解可以将一个对象中的 json 字符串序列换成 json 对象

@JsonValue
通过其名称进行序列化
通常用于枚举类的转换

@JsonRootName(value = "user")
可以在 jison 对象外再包裹一层,上面的这注解会在原来的对象外层增加一个 user 的根对象

@JsonSerialize(using = CustomDateSerializer.class)
自定义 Jackson 序列化

public class CustomDateSerializer extends StdSerializer<Date> {

    private static SimpleDateFormat formatter 
      = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

    public CustomDateSerializer() { 
        this(null); 
    } 

    public CustomDateSerializer(Class<Date> t) {
        super(t); 
    }

    @Override
    public void serialize(
      Date value, JsonGenerator gen, SerializerProvider arg2) 
      throws IOException, JsonProcessingException {
        gen.writeString(formatter.format(value));
    }
}

@JsonCreator
序列化时如果本对象没有对应的字段,可以在类的构造器上使用该注解,指定对应关系

@JacksonInject
表示属性将从注入而不是从 JSON 数据中获取其值

public class BeanWithInject {
    @JacksonInject
    public int id;
    
    public String name;
}

@Test
public void whenDeserializingUsingJsonInject_thenCorrect()
  throws IOException {
 
    String json = "{\"name\":\"My bean\"}";
    
    InjectableValues inject = new InjectableValues.Std()
      .addValue(int.class, 1);
    BeanWithInject bean = new ObjectMapper().reader(inject)
      .forType(BeanWithInject.class)
      .readValue(json);
    
    assertEquals("My bean", bean.name);
    assertEquals(1, bean.id);
}

@JsonAnySetter

@JsonSetter
反序列化时如果本对象没有对应的字段,可以在类的构造器上使用该注解,指定对应关系

@JsonDeserialize
自定义反序列化器。

public class EventWithSerializer {
    public String name;

    @JsonDeserialize(using = CustomDateDeserializer.class)
    public Date eventDate;
}

public class CustomDateDeserializer
  extends StdDeserializer<Date> {

    private static SimpleDateFormat formatter
      = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");

    public CustomDateDeserializer() { 
        this(null); 
    } 

    public CustomDateDeserializer(Class<?> vc) { 
        super(vc); 
    }

    @Override
    public Date deserialize(
      JsonParser jsonparser, DeserializationContext context) 
      throws IOException {
        
        String date = jsonparser.getText();
        try {
            return formatter.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

@JsonAlias
定义 一个或多个替代名称,适用于在反序列化时 pojo 匹配多个不确定的名称的 json 对象时使用

@JsonIgnoreProperties({ "id" })
是一个类级别的注释用于标记 Jackson 将忽略的属性或属性列表

@JsonIgnore
标记要在字段级别忽略的属性

@JsonIgnoreType
标记要忽略的带注释类型的所有属性,常用于内部类

@JsonInclude(Include.NON_NULL)
排除具有空/null/默认值的属性,用于类上

@JsonAutoDetect
覆盖 哪些属性可见和哪些不可见,比如启用序列化私有属性 JsonAutoDetect(fieldVisibility = Visibility.ANY)

Jackson 多态类型处理
@JsonTypeInfo – 指明序列化中要包含的类型信息的详细信息
@JsonSubTypes – 表示注解类型的子类型
@JsonTypeName – 定义用于注释类的逻辑类型名称

@JsonProperty
序列化/反序列化属性 名称 当我们处理非标准的 getter 和 setter

@JsonFormat
指定序列化日期/时间值时的格式

@JsonUnwrapped
序列化/反序列化时应该展开/展平的值

@JsonView
将包含属性以进行序列化/反序列化的视图,可以通过该注解控制需要展示的 json 数据,分组展示

@JsonManagedReference @JsonBackReference
可以处理父/子关系 并解决循环。

@JsonIdentityInfo
可以处理无限递归时的 json 问题

@JsonFilter
可以指定在序列化期间使用的过滤器,可以灵活的控制序列化的数据的多少

@JacksonAnnotationsInside
创建自定义 Jackson 注释,可以将多个注解形成一组,从而方便使用

// https://www.baeldung.com/jackson-annotations

posted @ 2022-09-07 15:32  LiuChengloong  阅读(356)  评论(0编辑  收藏  举报