覆盖内部对象的 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();
}
}
}
如评论中所述,如果经常使用 Skeleton
的 toString
方法,则使用 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 部分:使用过滤器忽略字段。
我已经覆盖了一个名为 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();
}
}
}
如评论中所述,如果经常使用 Skeleton
的 toString
方法,则使用 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 部分:使用过滤器忽略字段。