【问题标题】:What is equivalent code settings for @JSonIgnore annotation?@JSonIgnore 注释的等效代码设置是什么?
【发布时间】:2013-06-01 02:50:06
【问题描述】:

我是 Java 和 Jackson 以及我尝试使用的许多其他技术的新手,所以我希望能提供详细的答案。

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

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

【问题讨论】:

  • 如果您可以编辑主类或接口,那么只需在字段声明中使用关键字transient。瞬态字段不会被序列化。例如:public transient int test;
  • 感谢您的回答,但我无法触及主要课程。否则我会在特定字段上使用注释JSonIgnore,一切都会得到解决。
  • 这就是我所担心的,那么你可以尝试像这个例子一样使用视图:stackoverflow.com/a/8477588/1140748。

标签: java json serialization jackson json-serialization


【解决方案1】:

如果您无法更改您的类,您可以使用带有@JsonIgnore 注释的方法创建新的abstract class/interface。在这个class/interface 中,您可以定义ObjectMapper 在serialization/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();
}

编辑 - cmets 的答案

你可以创建这样的mixin接口:

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,我会努力效仿你的。
  • 抽象类 Someclass { String field5; } 类 UserInformation 扩展 SomeClass { String field3;字符串字段4; } 类用户 { 用户信息字段 1;字符串字段2; }
  • 抱歉格式化,如何使用 mixin 类序列化 field1 但没有 field3?这是一个更复杂的类结构,但如果你回答我这个问题,我可以很容易地适应。再次感谢您。
  • 我检查过了,但我需要 15 点声望才能对其进行投票,抱歉。也许我可以稍后再做,当我获得更多声望点时。再次感谢。
  • @Max,看看addMixIn 方法吧。
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多