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

什么是@JSonIgnore注释的等效代码设置?

方寒
2023-03-14

我不熟悉JavaJackson以及我尝试使用的许多其他技术,所以我希望得到详细的回答。

有没有办法防止一个或多个字段使用Jackson序列化为JSONString_格式,但不使用任何类型的JSON注释?

类似于:mapper。getSerializationConfig()。如果你知道我的意思的话,可以忽略(displayname)。我的对象是一个类的实例,它扩展了另一个类,并实现了一个接口,依此类推,因此字段来自类的层次结构。我需要该对象的JSON表示,但只包含某些字段,因此我可以通过POST方法在模拟请求中发送该JSON。我使用的是Jackson2.2.2

共有1个答案

狄望
2023-03-14

如果不能更改类,可以使用带有@JsonIgnore注释的方法创建新的抽象类/接口。在这个/接口中,您可以定义对象映射器序列化/反序列化过程中应该跳过的方法。

请参见以下示例:

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws IOException {
        Person person = new Person();
        person.setId(1L);
        person.setName("Max");

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.addMixIn(Person.class, PersonMixIn.class);

        System.out.println(objectMapper.writeValueAsString(person));
    }
}

abstract class Entity {

    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

interface Namamble {
    String getName();
}

class Person extends Entity implements Namamble {

    private String name;

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

interface PersonMixIn {
    @JsonIgnore
    String getName();
}

编辑-回答评论

您可以创建这样的混合界面:

public static interface UserInformationMixIn {
    @JsonIgnore
    String getField3();
}

并通过以下方式配置ObjectMapper

objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class);

在版本2.5中,方法AddMixinNotations已被弃用,应使用addMixIn

objectMapper.addMixIn(UserInformation.class, UserInformationMixIn.class);

完整示例源代码:

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws IOException {
        UserInformation userInformation = new UserInformation();
        userInformation.setField3("field3");
        userInformation.setField4("field4");
        userInformation.setField5("field5");

        User user = new User();
        user.setField1(userInformation);
        user.setField2("field2");

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.addMixIn(UserInformation.class, UserInformationMixIn.class);
        objectMapper.addMixIn(User.class, UserInformationMixIn.class);

        System.out.println(objectMapper.writeValueAsString(user));
    }

    public static abstract class Someclass {
        String field5;

        public String getField5() {
            return field5;
        }

        public void setField5(String field5) {
            this.field5 = field5;
        }
    }

    public static class UserInformation extends Someclass {
        String field3;
        String field4;

        public String getField3() {
            return field3;
        }

        public void setField3(String field3) {
            this.field3 = field3;
        }

        public String getField4() {
            return field4;
        }

        public void setField4(String field4) {
            this.field4 = field4;
        }
    }

    public static class User {
        UserInformation field1;
        String field2;

        public UserInformation getField1() {
            return field1;
        }

        public void setField1(UserInformation field1) {
            this.field1 = field1;
        }

        public String getField2() {
            return field2;
        }

        public void setField2(String field2) {
            this.field2 = field2;
        }
    }

public static interface UserInformationMixIn {
    @JsonIgnore
    String getField3();

    @JsonIgnore
    String getField2();

    @JsonIgnore
    String getField5();
}
}

有用链接:

  • 我如何告诉jackson忽略一个我无法控制源代码的属性

 类似资料:
  • 问题内容: 在使用CDI时,我可以使用注释创建一个生产者方法,以调用该方法来选择由注释注入实现接口的bean 。 现在,我正在使用Spring,但没有找到任何类似的东西。使用批注时,我需要使用什么来获得与CDI中批注相同的结果? 问题答案: 您正在寻找: @Bean是方法级别的注释,是XML 元素的直接类似物。批注支持所提供的大多数属性,例如:初始化方法,销毁方法,自动装配,延迟初始化,依赖项检查

  • 我已经编写了MongoDB查询来显示上周的用户数,基于配置文件集合中的lastActive字段,lastActive字段是日期字符串。有人能帮我用SimpleDataformat类或LocalDate类编写相应的Spring Boot java代码吗。请 这个如何写相应的Spring Boot代码,我不知道如何写mongo db的java等效查询,请帮我一个人

  • 我可以在lombok中使用@JsonIgnore和@getter注释,而不显式定义getter,因为我必须在序列化对象时使用这个JsonIgnore,但是在反序列化时,JsonIgnore注释必须是ignore,所以对象中的字段不能为空。 我知道,只要在password的getter上定义JsonIgnore就可以防止我的密码被序列化,但为此我必须显式定义我不想要的getter。任何建议,任何帮助

  • 问题内容: 我的问题是非常基本的,为什么我们人们使用注释,此注释的重要性是什么? 在旧的JDK中,为什么它不显示为警告,但是在最新的JDK中,则需要“为什么..”? 问题答案: 假设您有: 您 确实 打算覆盖,但是由于签名中的错误,它不是这样做的。如果使用,则可以让编译器检测故障。它 还会 向任何 阅读 代码的人表明这将覆盖现有方法或实现接口-为他们提供有关当前行为以及重命名该方法可能产生的影响的

  • 问题内容: 我看到Google用尖括号注释了一些Java代码。 例如: 这种风格有什么特殊用途吗? 问题答案: 这些片段是Firebase文档的链接器。 您可以在Firebase站点上单击类名,然后转到示例代码的相应块。 很难说它是动态生成的HTML,但是对于纯Java中的注释没有这种特殊的语法

  • 问题内容: 我知道类注释的目的,这要归功于Java中注释的使用方式和位置?。如本博客文章和Java语言规范的第7.4.1节所述,包注释的目的是什么? 您为什么要将元数据与程序包关联?你能做些什么? 问题答案: bnd工具(和maven-bundle-plugin)利用包注释。将@Version和@Export批注放在package-info.java中,可以生成OSGi元数据。 javadoc使用