如何防止杰克逊绕过演员?

时间:2016-06-26 01:45:00

标签: java jackson

我有一个对象,我希望我的杰克逊能够序列化。例如:

 public class RaceCar {
    public String model;
    public Int topSpeed;
}

我的困难在于我不希望所有RaceCar的字段都被序列化。我试图将我的对象转换为一个超类,它不能访问我想要隐藏的字段。例如:

    public class Car {
       public String model;
    }

然而,尽管演员阵容,杰克逊仍然设法序列化我所有的RaceCar领域。输出将是:

{"model": "x103", "topSpeed": 200}

即使将RaceCar对象强制转换为Object,Jackson也会序列化我所有的RaceCar字段。我猜杰克逊使用某种重叠机制来绕过我的演员。反正有没有阻止杰克逊绕过我的演员?

编辑:我应该指定我不能使用@JsonIgnore,因为在某些情况下我想返回整个对象,而在其他情况下,我想返回具有较少字段的对象。

1 个答案:

答案 0 :(得分:1)

MixIn就是您所需要的:

Q38034525.java

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

public class Q38034525
{
    public static void main(String[] args) throws Exception
    {
        final RaceCar rc = new RaceCar();
        rc.model = "Corvette Stringray";
        rc.topSpeed = 195;

        final ObjectMapper om = new ObjectMapper();
        System.out.println(om.writeValueAsString(rc));
        final ObjectMapper om2 = om.copy().addMixIn(RaceCar.class, RestrictedRaceCar.class);
        System.out.println(om2.writeValueAsString(rc));
    }

    public static abstract class RestrictedRaceCar
    {
        @JsonIgnore
        public Integer topSpeed;
    }

    public static class RaceCar
    {
        public String model;
        public Integer topSpeed;
    }
}

输出:

{"model":"Corvette Stringray","topSpeed":195}
{"model":"Corvette Stringray"}

注意:

  

您必须.copy()或创建ObjectMapper的新实例   是不可变的,只是在实例上执行.addMixIn()   修改它。