RecursiveToStringStyle 和 JSON_STYLE 如何使用 commons-lang3
How have RecursiveToStringStyle and JSON_STYLE using commons-lang3
我正在使用依赖项:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
我有以下对象:
public Class X {
private String a;
private String b;
private Y y;
}
public Class Y {
private String c;
private String d;
}
而且我需要递归地记录 class X 的内容以获得 class Y 以及使用 JSON 样式。这是我的目标,也是这个问题的目的。
方法一:
ToStringStyle style = ToStringStyle.JSON_STYLE;
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
方法 1 结果:
{"a":"<a>","b":"<b>","y": com.<packages>.y@<hash>}
方法二:
RecursiveToStringStyle style = new RecursiveToStringStyle();
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
方法 2 结果:
[com.<packages>.x@<hash>[a=<a>,b=<b>,y=com.<packages>.y@<hash>[c=<c>,d=<d>]]
成功方法:
`Merge of Approach 1 and Approach 2` but how to achieve this?
成功方法结果(我的目标):
{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}}
我找到了解决办法。我需要 Override
每个 classes
的方法 toString
(在本例中为 X
和 Y
)
public Class X {
private String a;
private String b;
private Y y;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
public Class Y {
private String c;
private String d;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
现在,方法 1 开始工作了。
您可以扩展 RecursiveToStringStyle class 以编写您自己的样式 class 并设置参数以匹配 JSON_STYLE 或与此相关的任何其他样式。
class CustomStyle extends RecursiveToStringStyle {
public CustomStyle() {
super();
super.setUseClassName(false);
super.setUseIdentityHashCode(false);
super.setContentStart("{");
super.setContentEnd("}");
super.setArrayStart("[");
super.setArrayEnd("]");
super.setFieldSeparator(",");
super.setFieldNameValueSeparator(":");
super.setNullText("null");
super.setSummaryObjectStartText("\"<");
super.setSummaryObjectEndText(">\"");
super.setSizeStartText("\"<size=");
super.setSizeEndText(">\"");
}
}
public class Z {
public String objectToString(Object obj) {
ToStringStyle style = new CustomStyle();
return new ReflectionToStringBuilder(obj, style).toString();
}
}
要创建自定义样式,最好查看在 ToStringStyle class 中设置的样式参数。您可以使用 setter 方法自定义自定义实现中的默认设置。
我有一个类似的问题,因为它也只影响一个字段,所以我最终这样做了(我实际上使用 SHORT_PREFIX_STYLE
但为了举例,我将其保留为 JSON ):
@Override
public String toString() {
return (new ReflectionToStringBuilder(this, ToStringStyle.JSON_STYLE) {
@Override
protected Object getValue(Field field) throws IllegalArgumentException, IllegalAccessException {
return "y".equals(field.getName()) ?
ReflectionToStringBuilder.toString(y, ToStringStyle.JSON_STYLE) :
super.getValue(field);
}
}).toString();
}
另一个原因是我无法控制字段 y
源代码。
(ToStringStyle
的实例没有以某种可组合的方式设计,这太糟糕了。我认为递归根本不是 "style" 的一部分,它是遍历的一个方面,应该已经独立建模)
我正在使用依赖项:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
我有以下对象:
public Class X {
private String a;
private String b;
private Y y;
}
public Class Y {
private String c;
private String d;
}
而且我需要递归地记录 class X 的内容以获得 class Y 以及使用 JSON 样式。这是我的目标,也是这个问题的目的。
方法一:
ToStringStyle style = ToStringStyle.JSON_STYLE;
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
方法 1 结果:
{"a":"<a>","b":"<b>","y": com.<packages>.y@<hash>}
方法二:
RecursiveToStringStyle style = new RecursiveToStringStyle();
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));
方法 2 结果:
[com.<packages>.x@<hash>[a=<a>,b=<b>,y=com.<packages>.y@<hash>[c=<c>,d=<d>]]
成功方法:
`Merge of Approach 1 and Approach 2` but how to achieve this?
成功方法结果(我的目标):
{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}}
我找到了解决办法。我需要 Override
每个 classes
的方法 toString
(在本例中为 X
和 Y
)
public Class X {
private String a;
private String b;
private Y y;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
public Class Y {
private String c;
private String d;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
现在,方法 1 开始工作了。
您可以扩展 RecursiveToStringStyle class 以编写您自己的样式 class 并设置参数以匹配 JSON_STYLE 或与此相关的任何其他样式。
class CustomStyle extends RecursiveToStringStyle {
public CustomStyle() {
super();
super.setUseClassName(false);
super.setUseIdentityHashCode(false);
super.setContentStart("{");
super.setContentEnd("}");
super.setArrayStart("[");
super.setArrayEnd("]");
super.setFieldSeparator(",");
super.setFieldNameValueSeparator(":");
super.setNullText("null");
super.setSummaryObjectStartText("\"<");
super.setSummaryObjectEndText(">\"");
super.setSizeStartText("\"<size=");
super.setSizeEndText(">\"");
}
}
public class Z {
public String objectToString(Object obj) {
ToStringStyle style = new CustomStyle();
return new ReflectionToStringBuilder(obj, style).toString();
}
}
要创建自定义样式,最好查看在 ToStringStyle class 中设置的样式参数。您可以使用 setter 方法自定义自定义实现中的默认设置。
我有一个类似的问题,因为它也只影响一个字段,所以我最终这样做了(我实际上使用 SHORT_PREFIX_STYLE
但为了举例,我将其保留为 JSON ):
@Override
public String toString() {
return (new ReflectionToStringBuilder(this, ToStringStyle.JSON_STYLE) {
@Override
protected Object getValue(Field field) throws IllegalArgumentException, IllegalAccessException {
return "y".equals(field.getName()) ?
ReflectionToStringBuilder.toString(y, ToStringStyle.JSON_STYLE) :
super.getValue(field);
}
}).toString();
}
另一个原因是我无法控制字段 y
源代码。
(ToStringStyle
的实例没有以某种可组合的方式设计,这太糟糕了。我认为递归根本不是 "style" 的一部分,它是遍历的一个方面,应该已经独立建模)