杰克逊为什么还要将瞬态成员序列化?

时间:2014-02-13 04:57:03

标签: json jackson transient

我使用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吗?

3 个答案:

答案 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