当前位置: 首页 > 知识库问答 >
问题:

为什么jackson也在序列化瞬态成员?

闻人宏盛
2023-03-14

我正在使用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,因为我不想将我的模型与杰克逊特定的注释联系起来。是否可以仅使用瞬态完成?对象映射器上是否有任何用于可见性设置的 API?

共有3个答案

易弘亮
2023-03-14

您可以使用springs属性对其进行配置

spring.jackson.mapper.propagate-transient-marker=true
鱼恩
2023-03-14

阻止Jackson序列化和反序列化的一种新方法是调用mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER,true)

路思源
2023-03-14

Jackson序列化< code>transient成员的原因是因为getter用于确定要序列化的内容,而不是成员本身——因为< code>y有一个公共getter,所以它被序列化。如果你想改变默认设置,让Jackson使用字段,只需:

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;
...

希望这有帮助。

 类似资料:
  • 问题内容: 杰克逊(Jackson)做的事情确实很奇怪,我找不到任何解释。我正在执行多态序列化,当对象独立时它可以完美地工作。但是,如果将同一个对象放入列表中并对其进行序列化,则会删除类型信息。 它丢失类型信息的事实将导致人们怀疑类型擦除。但这是在列表 内容 的序列化过程中发生的。Jackson要做的只是检查要序列化的当前对象以确定其类型。 我使用杰克逊2.5.1创建了一个示例: 这是输出: 如您

  • 杰克逊做了一件非常奇怪的事,我找不到任何解释。我正在进行多态序列化,当一个对象独立运行时,它可以完美地工作。但是,如果将同一对象放入列表并序列化该列表,则会删除类型信息。 它丢失类型信息的事实会导致可疑的类型擦除。但是这发生在序列化列表内容的过程中;Jackson所要做的就是检查它正在序列化的当前对象以确定其类型。 以下是输出: 如您所见,当对象位于列表中时,Jackson没有添加类型信息。有人知

  • 问题内容: 有效的Java-要保持单例保证,您必须声明所有实例字段都是瞬态的,并提供一个“ readResolve”方法。通过在此处声明瞬态场能实现什么?这是一个示例: 无论我是否将’state’变量声明为瞬态,我都会将c.getState()gettign打印为25。我在这里缺少什么吗? 问题答案: 通过使属性变为瞬态而获得的好处是,您无需序列化状态。序列化是不必要的,因为无论如何它都会被rea

  • 是否有方法序列化类的瞬态字段?文档中提到默认情况下不支持它,但是否有办法打开它? 非常感谢

  • 我有以下设置: ValidationResults类序列化后,我收到以下错误: 我使用play.libs.Json实用程序类,它只是Jackson对象映射器的包装器。有人知道问题是什么吗?我如何解决这个问题? ValidationError类的结构如下:

  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它