如何将bean用参考bean转换为java中的json



我试图通过gson将我的bean转换为JSON。我的豆(日志)包括另一个bean(log)和第二个bean引用第一个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;
    }

因此,当我尝试转换JSON格式时,我会遇到以上错误; Java.lang.stackoverflowerror

我认为这是一个周期,但是我该如何解决,我不知道

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

您在日志和日志之间具有循环引用。

当您尝试将日志转换为JSON时,它将与它一起转换日志。但是日志的引用对日志和日志的引用是再次引用日志并继续进行。因此,堆栈将无限地生长并在某个点溢出。

从日志中删除日志引用,或添加一些注释以忽略

您必须将日志的'日志列表'取消,以避免无限循环。尝试这样

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

您正在获取日志,并且急切地您正在获取日志,显然它可以进行连续的检索,因此它将永远不会结束,所以我建议下面删除" @manytoone"日志实体中的关系。

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

我知道那是最糟糕的,但我找不到任何方法!

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(","));
}

最新更新