覆盖内部对象的 toString

Override toString of internal object

我已经覆盖了一个名为 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 上调用 toString() 时 color 包含骨架的字段。

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

有谁知道如何让 Body 在 Skeleton 中使用覆盖的 toString() 方法?

您必须重写 Body class 的 toString() 方法并包括您认为必要的任何细节。包括实例变量 private Skeleton skeleton = ...toString() 方法以及您可能在 Body class.

中拥有的所有其他成员变量

与其手动排除 toString 方法中的字段,如果需要排除其他字段(或者如果 color 不应再被排除),这可能是乏味且容易出错的,您可以使用 Jackson @JsonIgnore 注释。那么可以重写Skeleton中的toString方法打印序列化后的字符串:

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();
        }
    }
}

如评论中所述,如果经常使用 SkeletontoString 方法,则使用 ObjectMapper 将对象序列化为 String 可能会很昂贵。如果性能成为一个问题,ObjectMapper 应该只用于序列化最顶层的对象(即 Body),而不是在每个中间对象(即 Skeleton):

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();
        }
    }
}

根据 OP 的反馈进行编辑

如果您只想忽略特定 ObjectMapper 的字段,您可以创建一个 SimpleBeanPropertyFilter 并指定要忽略的字段的名称:

public class Skeleton {

    private List bones;
    private Color color;

    @Override
    public String toString() {

        try {
            ObjectMapper mapper = new ObjectMapper();
            FilterProvider filters = new SimpleFilterProvider()
                .addFilter("ignoreColor", SimpleBeanPropertyFilter.serializeAllExcept("color"));
            return mapper.writer(filters).writeValueAsString(this);
        } 
        catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

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