覆盖内部对象的toString

时间:2019-01-03 11:52:00

标签: java jackson tostring objectmapper jackson-databind

我已经覆盖了名为 Skeleton 的对象的toString(),因此,当我调用toString()时,颜色变量将被排除。

public class Skeleton
{
    private List bones;
    private Color color;

    //  getters & setters

    @Override
    public String toString() 
    {
        String s = null;

        ObjectMapper mapper = new ObjectMapper();
        mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector(){
        @Override
        public boolean hasIgnoreMarker(final AnnotatedMember m) {
                List<String> exclusions = Arrays.asList("color");
                return exclusions.contains(m.getName())|| super.hasIgnoreMarker(m);
            }
        });

        try 
        {
            s = mapper.writeValueAsString(this);

        } catch (JsonProcessingException e) {

            e.printStackTrace();
        }

        return s;
    }
}

但是,当我将 Skeleton 对象作为变量添加到名为 Body 的对象并在Body的 color 字段上调用toString()时包括骷髅头。

public class Body
{
    private Skeleton skeleton = ....

有人知道如何使Body使用Skeleton中重写的toString()方法吗?

2 个答案:

答案 0 :(得分:1)

代替手动排除toString方法中的字段,如果需要排除其他字段(或者如果不再排除color则很麻烦且容易出错),可以使用Jackson @JsonIgnore注释。然后可以覆盖toString中的Skeleton方法以打印序列化的字符串:

public class Skeleton {

    private List bones;

    @JsonIgnore
    private Color color;

    @Override
    public String toString() {

        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(this);
        } 
        catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

如评论中所述,如果ObjectMapper的{​​{1}}方法被频繁使用,使用String将对象序列化为toString可能会很昂贵。如果性能成为问题,则Skeleton仅应用于序列化最顶层的对象(即ObjectMapper),而不是在每个中间对象(即Body)处进行序列化:

Skeleton

根据OP的反馈进行编辑

如果您只想忽略特定public class Skeleton { private List bones; @JsonIgnore private Color color; // Getters & setters } public class Body { private Skeleton skeleton; @Override public String toString() { try { ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(this); } catch (JsonProcessingException e) { e.printStackTrace(); } } } 的字段,则可以创建ObjectMapper并指定要忽略的字段的名称:

SimpleBeanPropertyFilter

有关详细信息,请参阅Jackson Ignore Properties on Marshalling上的第5节:使用过滤器忽略字段

答案 1 :(得分:0)

您必须重写Body类的toString()方法,并包括您认为必要的任何详细信息。包括实例变量toString()的{​​{1}}方法和您可能在private Skeleton skeleton = ...类中拥有的所有其他成员变量。