javareflectiontostringapache-commons-lang

How have RecursiveToStringStyle and JSON_STYLE using commons-lang3


I'm using the dependency:

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

I have the following objects:

public Class X {

  private String a;
  private String b;
  private Y y;
}

public Class Y {
  private String c;
  private String d;
}

And I need to log the content of the class X recursively to get the class Y as well and using the JSON style. That is my goal and this is the purpose of this question.

Approach 1:

ToStringStyle style = ToStringStyle.JSON_STYLE;
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));

Approach 1 result:

{"a":"<a>","b":"<b>","y": com.<packages>.y@<hash>}

Approach 2:

RecursiveToStringStyle style = new RecursiveToStringStyle();
LOGGER.debug(ReflectionToStringBuilder.toString(new X(), style, false, false));

Approach 2 result:

[com.<packages>.x@<hash>[a=<a>,b=<b>,y=com.<packages>.y@<hash>[c=<c>,d=<d>]]

Successful Approach:

`Merge of Approach 1 and Approach 2` but how to achieve this? 

Successful Approach result (My goal):

{"a":"<a>","b":"<b>","y":{"c":"<c>","d":"<d>"}}

Solution

  • I found the solution. I need to Override the method toString of each classes (X and Y in this case)

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

    And now, with the approach 1 It's working.