Jackson 注解开发
1、 Jackson 序列化注解
@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"
}
@JsonGetter
:序列化时别名,作用于get方法上@JsonPropertyOrder
:序列化时排列排列顺序@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);
}
}
最后更新于
这有帮助吗?