Jackson 会将一个符合 getXXX 格式的方法也变成一个属性
Jackson 会将一个符合 getXXX 格式的方法也变成一个属性
Jackson 会将一个符合 getXXX 格式的方法也变成一个属性即使类中并不存在名称为 xXX 的属性。
这是因为在使用 Jackson 库将 Java 对象转换为 JSON 字符串时,默认情况下,Jackson 会尝试将对象的所有公共字段和公共 getter 方法转换为 JSON 字段。这是因为 Jackson 遵循 Java Bean 规范,该规范定义了如何通过 getter 和 setter 方法来访问和修改对象的属性。
如果你不希望某些方法被转换为 JSON 字段,你可以在这个方法上添加注解 @JsonIgnore
为什么会把方法也变成字段?
-
Java Bean 规范:
- Java Bean 规范要求对象的属性应该通过 getter 和 setter 方法来访问和修改。Jackson 默认遵循这一规范,因此它会查找对象的公共 getter 方法,并将其视为属性。
- 例如,如果你有一个
getName()
方法,Jackson 会认为name
是一个属性,并将其添加到生成的 JSON 中。
-
默认行为:
- Jackson 的默认行为是尽可能多地包含对象的信息。因此,它会查找所有公共的 getter 方法,并将其转换为 JSON 字段。
-
自定义需求:
- 如果你不希望某些方法被转换为 JSON 字段,你可以通过注解(如
@JsonIgnore
)来控制哪些方法或字段应该被忽略。
- 如果你不希望某些方法被转换为 JSON 字段,你可以通过注解(如
如何控制哪些方法或字段被转换?
-
使用
@JsonIgnore
注解:- 你可以使用
@JsonIgnore
注解来标记你不希望被序列化的 getter 方法或字段。
public class MyClass { private String name; @JsonIgnore public String getName() { return name; } }
- 你可以使用
-
使用
@JsonProperty
注解:- 你可以使用
@JsonProperty
注解来显式指定某个 getter 方法应该被序列化为 JSON 字段。
public class MyClass { private String name; @JsonProperty("full_name") public String getName() { return name; } }
- 你可以使用
-
使用
@JsonIgnoreProperties
注解:- 你可以在类级别使用
@JsonIgnoreProperties
注解来忽略特定的字段或方法。
@JsonIgnoreProperties({"name"}) public class MyClass { private String name; public String getName() { return name; } }
- 你可以在类级别使用
-
自定义
ObjectMapper
配置:- 你还可以通过配置
ObjectMapper
来控制序列化的行为,例如通过setVisibility
方法来设置哪些字段或方法应该被序列化。
ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
- 你还可以通过配置
总结
Jackson 默认会将对象的公共 getter 方法转换为 JSON 字段,这是因为它遵循 Java Bean 规范。如果你不希望某些方法被转换,可以使用注解(如 @JsonIgnore
)或自定义 ObjectMapper
配置来控制序列化的行为。