Search code examples
javagsonjavabeansto-json

How to convert bean with reference bean to json in java?


I am trying to convert my bean to json via Gson. My bean (Logs) include another bean(Log) and second bean reference to first bean.

@Entity
@Table(name = "t_logs")
public class Logs {

    @Id
    @Column(name = "executionid")
    private String executionId;

    @Column(name = "sentdate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date sentDate;

    @Column(name = "sent")
    private boolean sent;

    @OneToMany(mappedBy = "logs", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Log> logList;}


@Entity
@Table(name = "t_log")
public class Log {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @ManyToOne
    @JoinColumn(name = "executionid")
    private Logs logs;

    @Column(name = "startdate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date startDate;

    @Column(name = "enddate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date endDate;
    }

So when I try to convert Json format, I getting an error like above; java.lang.StackOverflowError

I think this is a cycle but how can I resolve it, I don't know

        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
        return gson.toJson(logs, Logs.class);

Solution

  • I know that is the worst but I could not find any way!

    private String convertToMyJSON(Logs logs) {
    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    
        String jsonObject = "{"
                + "\"executionId\":\"" + logs.getExecutionId() + "\","
                + "\"startDate\":\"" + sdf.format(logs.getStartDate()) + "\","
                + "\"logList\":[" + getLogString(logs) + "]"
                + "}";
    
        return jsonObject;
    }
    
    private String getLogString(Logs logs) {
    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    
        String logString = "";
    
        for (Log l : logs.getLogList()) {
    
            logString = logString
                    + "{"
                    + "\"id\":" + l.getId() + ","
                    + "\"executionId\":\"" + logs.getExecutionId() + "\","
                    + "\"startDate\":\"" + sdf.format(l.getStartDate()) + "\","
                    + "\"endDate\":\"" + sdf.format(l.getEndDate()) + "\","
                    + "},";
        }
    
        return logString.substring(0, logString.lastIndexOf(","));
    }