如何将带有引用 bean 的 bean 转换为 java 中的 json?

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

我正在尝试通过 Gson 将我的 bean 转换为 json。我的 bean (Logs) 包括另一个 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.WhosebugError

我认为这是一个循环,但我不知道如何解决它

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

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

当您尝试将日志转换为 Json 时,它会转换日志及其引用。但是日志引用了日志,日志引用了再次登录并继续。所以堆栈会无限增长并在某一点溢出。

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

您必须取消日志的 'logList' 以避免无限循环。 像这样尝试

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