我使用Jackson 2.1.4将POJO序列化为JSON,但我想忽略序列化的特定字段。我使用了瞬态,但它仍在序列化该元素。
public class TestElement {
int x;
private transient String y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public String getY() {
return y;
}
public void setY(String y) {
this.y = y;
}
}
我按顺序排列如下:
public static void main(String[] args) throws JsonProcessingException {
TestElement testElement = new TestElement();
testElement.setX(10);
testElement.setY("adasd");
ObjectMapper om = new ObjectMapper();
String serialized = om.writeValueAsString(testElement);
System.err.println(serialized);
}
请不要建议@JsonIgnore
,因为我不想将我的模型与杰克逊特定的注释联系起来。可以仅使用瞬态完成吗? objectmapper上有可用于可见性设置的API吗?
答案 0 :(得分:47)
杰克逊序列化transient
成员的原因是因为getter用于确定序列化的内容,而不是成员本身 - 并且由于y
具有公共getter,因此序列化。
如果你想改变那个默认值并让杰克逊使用字段 - 只需:
om.setVisibilityChecker(
om.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE));
忽略序列化属性的另一种方法是直接在类上执行:
@JsonIgnoreProperties(value = { "y" })
public class TestElement {
...
另一种方式直接在现场:
public class TestElement {
@JsonIgnore
private String y;
...
希望这会有所帮助。
答案 1 :(得分:2)
我无法在此处完成上述回复,更改(现在)已弃用的方法setVisibilityChecker
并为布尔值添加缺失条款:
mapper.setVisibility(
mapper.getSerializationConfig().
getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).
withGetterVisibility(JsonAutoDetect.Visibility.NONE).
withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
);
答案 2 :(得分:2)
您可以使用springs属性进行配置
spring.jackson.mapper.propagate-transient-marker=true