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

Jackson:在序列化时抑制JsonTypeinfo?

罗梓
2023-03-14
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "_typeid")

我知道删除或修改注释可以做到这一点,但在这种情况下这不是一个选项。

ObjectMapper().configure(MapperFeature.USE_ANNOTATIONS, false);

-将关闭所有注释。这确实删除了冒犯字段,但也扼杀了我想工作的其他注释。

共有1个答案

焦博实
2023-03-14

您可以使用JSONVIEW注释在运行时添加/删除注释。假设我们有一个抽象类base和一个实现base1。不是直接向添加注释,我们可以通过添加带有这些注释的新接口来实现这一点。参见下面的示例:

abstract class Base {
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_typeid")
@JsonSubTypes({
        @JsonSubTypes.Type(name = "base1", value = Base1.class)
})
interface BaseTypeView {
}

class Base1 extends Base {
    private String value = "Base 1";

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

现在,我们需要创建两个ObjectMapper:一个wich使用这个视图,另一个不使用这个视图。

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = createObjectMapper();
        ObjectMapper mapperWithView = createObjectMapper();
        mapperWithView.addMixIn(Base.class, BaseTypeView.class);

        System.out.println(mapper.writeValueAsString(new Base1()));
        System.out.println(mapperWithView.writeValueAsString(new Base1()));
    }

    private static ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        return mapper;
    }
}

上面的代码打印:

{
  "value" : "Base 1"
}
{
  "_typeid" : "base1",
  "value" : "Base 1"
}
 类似资料:
  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 问题内容: 我使用以下代码来序列化从外部服务获得的响应,并作为我的服务的一部分返回json响应。但是,当外部服务返回带有时区(10:30:00.000-05.00)的时间值时,杰克逊会将其转换为15:30:00。如何忽略时区值? 问题答案: 您可以创建自定义解串器 告诉杰克逊使用您的自定义解串器 并像这样使用它: 您可以使用Jackson自定义序列化为服务响应添加时区信息

  • 在这种情况下,如果验证失败,我希望将请求返回给用户,并附上相应的错误消息。我遇到的问题是,我使用Jackson处理JSON请求,验证失败也会导致Jackson无法序列化消息。 例如,如果我有此对象: ...当我去序列化时,字段无效(假设它有11个字符)... ...我得到了一个JsonProcessingException(错误验证对象)。我已经确认一个有效的对象序列化没有问题。所以我的问题是:我

  • 对于某些用例,我需要将一个POJO转换为另一个具有不同字段名称的POJO。我试着使用Jackson对象映射器。它在某些方面起了作用。然而,最终的结果并不是我所期望的。 如果运行,输出将是: SOUT:UserMap{name_new='Deepak',meta=address::Singapore,id::111} 杰克逊:{“姓名”:“迪帕克”,“地址”:“新加坡”,“身份证”:“111”} 我

  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)

  • 主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试