我认为杰克逊基于方法的序列化,有什么方法可以让它基于字段吗?
例如:
class Bean {
Integer i;
String s;
public Integer getI() { return this.i; }
public void setI(Integer i) { this.i = i; }
public bool isSetI() { return this.i != null; }
// same for s as well
}
输出JSON具有“i”和“setI”。无论如何我可以覆盖这个只获得“我”? 如果有一种方法可以在不向类添加任何注释的情况下执行此操作(它们是自动生成的),那就太棒了。
答案 0 :(得分:11)
查看@JsonAutoDetect注释。例如:
@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE)
public class Bean {
Integer i;
String s;
Integer getI() { return this.i; }
void setI(Integer i) { this.i = i; }
bool isSetI() return { this.i == null; }
// same for s as well
}
答案 1 :(得分:6)
杰克逊也可以使用领域,是的;但默认情况下,只发现公共字段。但您可以使用@JsonProperty
标记非公开字段。
需要注意的一点是,如果同时存在方法(setX,getX)和字段(x),则方法将具有优先权。这通常不是问题,但如果是,则需要通过向其添加@JsonIgnore
enxt来显式禁用不使用的方法。
答案 2 :(得分:5)
要在没有注释的情况下完成此操作,您可以在按以下方式序列化/反序列化之前配置ObjectMapper
:
ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker().
withGetterVisibility(JsonAutoDetect.Visibility.NONE).
withSetterVisibility(JsonAutoDetect.Visibility.NONE));
答案 3 :(得分:3)
接受的答案对我没有产生预期的结果。在不添加注释的情况下对我有用的是以下列方式配置ObjectMapper
:
ObjectMapper om = new ObjectMapper()
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
这对我来说似乎更有意义,它使用字段而不是像标准Java序列化那样的getter \ setter。