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

6

我对JavaJackson和其他许多技术都很陌生,但我试图使用它们,因此我希望能得到详细的答案。

是否有一种方法可以防止一个或多个字段被序列化为JSON字符串格式,而不使用任何类型的JSON注释呢?

例如:mapper.getSerializationConfig().something(ignore("displayname")) 如果你知道我的意思的话。 我的对象是一个类的实例,该类继承了另一个类,并实现了一个接口等等,因此这些字段来自一系列类的继承结构。 我需要该对象的JSON表示,但仅包含某些字段,以便我可以通过POST方法将该JSON发送到模拟请求中。 我正在使用Jackson 2.2.2版本。


如果您可以编辑主类或接口,则只需在字段声明中使用关键字“transient”。瞬态字段不会被序列化。例如:public transient int test; - alain.janinm
谢谢你的回答,但我不能触碰主类。否则,我会在特定字段上使用注释JsonIgnore,这样一切都会解决。 - niceman
这就是我担心的,那么你可以尝试像这个例子中使用视图:https://dev59.com/Pl7Va4cB1Zd3GeqPHjU0#8477588。 - alain.janinm
1个回答

6
如果您无法更改您的类,您可以创建一个带有@JsonIgnore注释的新的abstract class/interface。在这个class/interface中,您可以定义ObjectMapperserialization/deserialization过程中应该跳过的方法。
请看下面的例子:
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中,方法addMixInAnnotations已被弃用,应使用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();
}
}

有用的链接:


谢谢你,Mykhaylo。我会尝试跟随你的例子。 - niceman
抽象类 Someclass { String field5; }class UserInformation extends SomeClass { String field3; String field4; }class User { UserInformation field1; String field2; } - niceman
2
我已经查看了,但是我需要15个声望点才能够给它点赞,抱歉。也许等我获得更多的声望点后再来点赞。再次感谢。 - niceman
非常好,对我来说这意味着包含POJO的逻辑层可以完全不知道我们在使用JSON作为REST接口。 - Sebastian
1
@Max,请看一下addMixIn方法。 - Michał Ziober
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接