通过 toString() 将对象转换为字符串时排除空属性


class Person {
public String name;
public String nickname;
} 

当将 POJO 从对象转换为字符串时,我想排除任何为 null 的值,这样如果我有Person = {name = "Jack", nickname = null},toString(( 将只返回{name = "Jack"}

这个用例可能吗?

编辑:是的,我正在使用龙目岛。也许解决方案是实现我自己的 toString((

引用:

  • https://groups.google.com/forum/#!topic/project-lombok/YC-eo2_XmsI

至于现在,这个省略空值的功能是龙目岛的 NYI,所以你必须实现自己的 toString 方法。

您可以使用StringJoiner1并显式跳过空值,也可以使用番石榴中的帮助程序ToStringHelper2

class Person {
public String name;
public String nickname;
@Override
public String toString() {
final var joiner = new StringJoiner(", ", Person.class.getSimpleName() + "[", "]");
if (name != null) {
joiner.add("name='" + name + "'");
}
if (nickname != null) {
joiner.add("nickname='" + nickname + "'");
}
return joiner.toString();
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.omitNullValues()
.add("name", name)
.add("nickname", nickname)
.toString();
}
}

你可以使用 commons-lang3 来实现你的目标。

您唯一需要做的一件事是重写Person类中的toString()方法:

public class Person {
private String name;
private String nickName;
// getters and setters
@Override
public String toString() {
final Object myself = this;
ReflectionToStringBuilder builder = new ReflectionToStringBuilder(this, ToStringStyle.JSON_STYLE) {
@Override
protected boolean accept(Field field) {
try {
return super.accept(field) && field.get(myself) != null;
}
catch (IllegalAccessException e) {
return super.accept(field);
}
}
};
return builder.toString();
}
}

如果name字段值不为空,但nickName为空,则结果:

{"name":"John"}

您需要将以下依赖项添加到pom.xml

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>

使用ReflectionToStringBuilder类的好处是,如果添加新的类成员变量,则无需触摸toString()方法,因为此类使用反射。

最新更新