📜  Java应用程序的 Jackson 注释

📅  最后修改于: 2022-05-13 01:55:46.061000             🧑  作者: Mango

Java应用程序的 Jackson 注释

Java在编码领域有着巨大的应用,几乎我们所有人都知道这个事实。它的功能之一是 Jackson 注释。尽管对于参与编码世界的人们来说,这是一个非常熟悉的术语,但鲜为人知。 Jackson 是一个流行且非常高效的Java库,用于将Java对象映射或序列化为 JSON,反之亦然。

由于 Jackson 是一个基于Java的库,因此在继续使用 Jackson 之前必须了解Java的基础知识。它提供了以下列出的各种功能:

  • Jackson 是一个易于使用的库,可以简化常用案例。
  • 由于它提供了默认映射,因此不需要在 Jackson 中创建映射。
  • 它具有值得称道的速度和低内存占用,使其适用于大型对象系统。
  • Jackson 创建的 JSON 结果紧凑干净,易于阅读。
  • Jdk 是 Jackson 需要的唯一库。因此,它没有依赖性。
  • 最重要的是,Jackson 库可以免费使用,因为它是开源的。

在了解了使用Jackson的用途和优势之后,我们现在需要了解Jackson注解如下:

  1. @JsonAnyGetter
  2. @JsonGetter
  3. @JsonPropertyOrder
  4. @JsonRawValue
  5. @JsonValue
  6. @JsonRootName
  7. @JsonSerialize
  8. @JsonCreator
  9. @JacksonInject
  10. @JsonAnySetter
  11. @JsonSetter
  12. @JsonDeserialize
  13. @JsonEnumDefaultValue
  14. @JsonIgnoreProperties
  15. @JsonIgnore
  16. @JsonIgnoreType
  17. @JsonInclude
  18. @JsonAutoDetect
  19. @JsonTypeInfo
  20. @JsonSubTypes
  21. @JsonTypeName
  22. @JsonProperty
  23. @JsonFormat
  24. @JsonUnwrapped
  25. @JsonView
  26. @JsonManagedReference
  27. @JsonBackReference
  28. @JsonIdentityInfo
  29. @JsonFilter
  30. @JacksonAnnotationsInside

让我们讨论每个注释,以便通过实现它们为所有注释提供片段代码来更深层次地理解它们。

注释 1: @JsonAnyGetter



t 使用 getter 方法促进 Maps 的返回。稍后,映射用于以与其他属性相同的方式序列化 JSON 的其他属性。

public class ExtendableBean {
  
  public String name;
  private Map properties;

  @JsonAnyGetter
  public Map getProperties() {
    return properties;
  }
}

注释 2: @JsonGetter

此注释有助于将特定方法标记为 getter 方法。

public class MyBean {
  
  public int id;
  private String name;

  @JsonGetter("name")
  public String getTheName() {
    return name;
  }
}

注释 3:@JsonPropertyOrder

当您序列化一个 JSON 对象时,它的顺序可能会改变,但此注释有助于在处理过程中保留特定顺序。

@JsonPropertyOrder({ "name", "id" })

public class MyBean {

  public int id;
  public String name;
}

注释 4: @JsonRawValue

使用这个注解,可以在没有任何修饰或转义的情况下序列化任何单词。

public class RawBean {
  
  public String name;

  @JsonRawValue
  public String json;
}

注释 5: @JsonValue



使用此注释,您可以使用单个方法序列化整个对象。

public enum TypeEnumWithValue {

  TYPE1(1, "Type A"), TYPE2(2, "Type 2");

  private Integer id;
  private String name;

  // Standard constructors

  @JsonValue
  public String getName() {
    return name;
  }
}

注释 6: @JsonRootName

此注释有助于显示通过 JSON 指定的根节点。还需要启用包装根值。

{
  "id": 1,
  "name": "John"
}

注释 7: @JsonSerialize

使用此注释,您可以指定自定义序列化程序来编组 JSON 对象。

public class EventWithSerializer {

  public String name;

  @JsonSerialize(using = CustomDateSerializer.class)
  public Date eventDate;
}

注释 8: @JsonCreator

在反序列化过程中,使用了工厂方法。此注释用于微调此方法。

{
  "id": 1,
  "theName": "My bean"
}

注释 9: @JacksonInject

当我们不必解析属性值而是将其注入到 JSON 输入中时,我们使用此注释。

public class BeanWithInject {
  
  @JacksonInject
  public int id;

  public String name;
}

注释 10: @JsonAnySetter



就像 getter 注释一样,这有助于使用 Map 的 setter 方法,然后使用该方法以与其他属性相同的方式反序列化 JSON 的其他属性。

public class ExtendableBean {
  
  public String name;
  private Map properties;

  @JsonAnySetter
  public void add(String key, String value) {
    properties.put(key, value);
  }
}

注释 11: @JsonSetter

此注释允许将任何方法标记为 setter 方法。

public class MyBean {
  
  public int id;
  private String name;

  @JsonSetter("name")
  public void setTheName(String name) {
    this.name = name;
  }
}

注释 12: @JsonDeserialize

此注释用于指定自定义反序列化器以解组 JSON 对象。

public class EventWithSerializer {
  
  public String name;

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

注释 13: @JsonEnumDefaultValue

使用此注释,我们使用默认值反序列化未知枚举值。

public class AliasBean {
  
  @JsonAlias({ "fName", "f_name" })
  private String firstName;
  private String lastName;
}

注释 14: @JsonIgnoreProperties

使用此注释,您可以将一个属性或一组属性标记为要忽略。这是在类级别完成的。

@JsonIgnoreProperties({ "id" })
public class BeanWithIgnore {
    public int id;
    public String name;
}

注释 15: @JsonIgnore



这个与上面的目的相同,唯一的区别是它在字段级别使用。

public class BeanWithIgnore {

  @JsonIgnore

  public int id;
  public String name;
}

注释 16: @JsonIgnoreType

使用此注释,您可以将特定类型的属性标记为要忽略。

public class User {

  public int id;
  public Name name;

  @JsonIgnoreType
  public static class Name {

    public String firstName;
    public String lastName;
  }
}

注释 17: @JsonInclude

此注释用于那些具有 null 或空默认值的排除属性。

@JsonInclude(Include.NON_NULL)

public class MyBean {

  public int id;
  public String name;
}

注释 18: @JsonAutoDetect

此注释有助于检测不可见或以其他方式无法访问的属性。

@JsonAutoDetect(fieldVisibility = Visibility.ANY)

public class PrivateBean {

  private int id;
  private String name;
}

注释 19: @JsonTypeInfo

使用此注释,您可以指明在序列化或反序列化期间必须包含的信息类型的详细信息。

注释 20: @JsonSubTypes

这一个用于指示已注释的类型的子类型。

注释 21: @JsonTypeName

使用这个可以设置必须用于带注释的类的类型名称。

public class Zoo {

  public Animal animal;

  @JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = As.PROPERTY,
    property = "type")

  @JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
  })

  public static class Animal {
    public String name;
  }

  @JsonTypeName("dog")
  public static class Dog extends Animal {
    public double barkVolume;
  }

  @JsonTypeName("cat")
  public static class Cat extends Animal {
    boolean likesCream;
    public int lives;
  }
}

注释 22: @JsonProperty

此注释用于标记必须使用的关于 JSON 属性的非标准 setter 或 getter 方法。

public class MyBean {
  
  public int id;
  private String name;

  @JsonProperty("name")
  public void setTheName(String name) {
    this.name = name;
  }

  @JsonProperty("name")
  public String getTheName() {
    return name;
  }
}

注释 23: @JsonFormat

该注解通常用于日期字段,并指定序列化或反序列化期间的格式。

public class EventWithFormat {

  public String name;

  @JsonFormat(
    shape = JsonFormat.Shape.STRING,
    pattern = "dd-MM-yyyy hh:mm:ss")
  public Date eventDate;
}

注释 24: @JsonUnwrapped

在序列化或反序列化的过程中,需要对对象的值进行解包。此注释用于实现目的。

public class UnwrappedUser {

  public int id;

  @JsonUnwrapped
  public Name name;

  public static class Name {

    public String firstName;
    public String lastName;
  }
}

注释 25: @JsonView



该注解用于控制值是否被序列化。

public class Views {
    public static class Public {}
    public static class Internal extends Public {}
}

注释 26: @JsonManagedReference

此类注释用于显示具有父子关系的对象。

public class ItemWithRef {
  
  public int id;
  public String itemName;

  @JsonManagedReference
  public UserWithRef owner;
}

注释 27: @JsonBackReference

这与前一个共享相同的函数。

private class Player {

  public int id;
  public Info info;
}

private class Info {

  public int id;
  public Player parentPlayer;
}

// Something like this will come into play
Player player = new Player(1);
player.info = new Info(1, player);

注释 28: @JsonIdentityInfo

该注解用于存在父子关系的情况。它用于指示在序列化和反序列化期间将使用对象标识。

Java
@JsonIdentityInfo(
  generator = ObjectIdGenerators.PropertyGenerator.class,
  property = "id")
public class ItemWithIdentity {
    public int id;
    public String itemName;
    public UserWithIdentity owner;
}


注释 29: @JsonFilter

该注解可用于在序列化和反序列化过程中应用过滤器。

@JsonFilter("myFilter")

public class BeanWithFilter {

  public int id;
  public String name;
}

注释 30: @JacksonAnnotationsInside

此注释可用于创建自定义的 Jackson 注释。

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonInclude(Include.NON_NULL)
@JsonPropertyOrder({ "name", "id", "dateCreated" })

public @interface CustomAnnotation {}

在使用这些注解时,Jackson 本身在创建值实例时使用默认构造函数。但是,可以通过放置自定义构造函数来更改它。此外,Jackson 可以处理多态类型,即具有各种子类型的对象。这是通过启用包含类型信息来实现的。因此,这些是关于 Jackson 注释、它们的使用以及它们在Java的重要性的几点和基本信息。