Jackson 注解开发

1、 Jackson 序列化注解

  1. @JsonAnyGetter:允许灵活地将Map属性用作标准属性平铺在父对象上,适用序列化,作用于get方法上,返序列化用@JsonAnySetter

@Data
public class OrderDetails {
    Map<String, String> tempMap = new HashMap<String, String>(){{
        put("temp","temp");
        put("temp1","temp1");
    }};

    @JsonAnyGetter
    public Map<String, String> getTempMap() {
        return tempMap;
    }
}

//
{
    "temp": "temp",
    "temp1": "temp1"
}
  1. @JsonGetter:序列化时别名,作用于get方法上

  2. @JsonPropertyOrder:序列化时排列排列顺序

  3. @JsonRootName:包一层

1.4 @JsonRawValue

1.5 @JsonValue

1.7 @JsonSerialize

Jackson 反序列化注解

2.1、 @JsonCreator

2.2、 @JacksonInject

2.3、 @JsonAnySetter

2.4、 @JsonSetter

2.5、 @JsonDeserialize

2.6、 @JsonAlias

Jackson 属性注解

3.1、 @JsonIgnoreProperties

3.2、 @JsonIgnore

3.3、 @JsonIgnoreType

3.4、 @JsonInclude

3.5、 @JsonAutoDetect

Jackson常用注解

4.1、 @JsonProperty

4.2、 @JsonFormat

4.4、 @JsonView

4.5、 @JsonManagedReference,@ JsonBackReference

4.6、 @JsonIdentityInfo

4.7、 @JsonFilter

@JsonAnyGetter

@JsonAnyGeter注解,可以灵活地把类型为Map的属性作为标准属性序列化到JSON字符串中,有如下特点:

  • 方法为非静态方法,并且方法不带任何参数。

  • 返回值必须是Map类型

  • 在一个实体类中只能用在一个方法上

class User {
    Map<String, Object> map = new HashMap<>();

    public void set(String name, Object value) {
        map.put(name, value);
    }


    @JsonAnyGetter
    public Map<String, Object> get() {
        return map;
    }
}

@JsonGetter

@JsonGetter注解是@JsonProperty注解的替代方法,用于将方法标记为getter方法。

public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

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

    @JsonGetter("age")
    public Integer getMyAge() {
        return age;
    }
}

# 不添加@JsonGetter("name")注解
{"myName":"张三","myAge":18}
# 添加@JsonGetter("name")注解
{"name":"张三","age":18}

@JsonPropertyOrder

我们可以使用@JsonPropertyOrder注解 来指定序列化时各个属性的顺序。

@Getter
@Setter
@JsonPropertyOrder({"age","name"})
public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

还可以使用@JsonPropertyOrder(alphabetic=true)按字母顺序进行排序。

@JsonRawValue

如果对象中某个字段的值是 JSON,在使用Jackson序列化时,输出的JSON会有问题,这时我们可以使用注解 @JsonRawValue将JSON值原样输出。

@Getter
@Setter
@JsonPropertyOrder({"age","name"})
public class User {
    private String name;
    private Integer age;

    @JsonRawValue
    private String rawJson = "{\"name\":\"张三\",\"age\":18}";

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

@JsonValue

@JsonValue可以用在字段或者字段对应的get方法上,当加上@JsonValue注解时,序列化返回的不再是JSON字符串,而是字段对应的值。一个类中只能有一个@JsonValue注解。

@Getter
@Setter
@JsonPropertyOrder({"age", "name"})
public class User {
    private String name;
    @JsonValue
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
// 返回18

@JsonRootName

正常情况下,我们定义一个User实体,并序列化成JSON字符串,输出结果如下:

{"age":18,"name":"张三"}

但是,在某些情况下我们需要将JSON包装成如下格式:

{{"age":18,"name":"张三"}}

@JsonRootName注解指定要包装的root名称,并在ObjectMapper实例中启用包装。

@Getter
@Setter
@JsonRootName("user")
public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
public class UserTest {
    private final ObjectMapper mapper = new ObjectMapper();

    @Test
    public void save() throws JsonProcessingException {
        User user = new User("张三", 18);
        mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
        String jsonString = mapper.writeValueAsString(user);
        System.out.println(jsonString);
    }
}

最后更新于

这有帮助吗?