我已经覆盖了名为 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()方法吗?
答案 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 = ...
类中拥有的所有其他成员变量。