使用java生成json時產生棧溢出錯誤問題及解決方案

java生成json時產生棧溢出錯誤

環境

java + hibernate +html

本來,java中使用json事件很正常的事,但小心有的地方有點“坎兒”。

比如,在java中建立瞭json對象想傳到前臺去:

List<Comment> commentsList = commentMng.findByArticleId(articleid);
JSONArray jsonMembers = new JSONArray(commentsList);
...

註意這裡,得到瞭一個關於Comment的list數組commentsList。如果Comment類型中的成員變量,都是普通的成員變量,那麼ok,這麼操作沒問題。

如果Comment類型的表中包含外鍵,而Comment本身又與該外鍵對應的變量是多對一的關系,比如Comment中有個Article字段,多個Comment變量可以對應一個Article變量。

那麼在這種情況下:

JSONArray jsonMembers = new JSONArray(commentsList);

這裡會出現棧溢出錯誤

java.lang.StackOverflowError

在這種情況下,解決的辦法就是將原有的List類型的list分解,也就是將commentsList分解,單獨將變量傳進JSONArray:

JSONArray jsonMembers = new JSONArray();
for ( Comment comment : commentsList) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("id", blogComment.getId());
    ...
    ...
    jsonMembers.put(jsonObject);
}

當然那個多對一的字段信息如果想傳遞進去,也是不能直接將Comment類型的變量放到jsonObject裡面的,而是需要字符串化,總之專遞的盡量是字符串信息。

json轉換時出現棧內存溢出

加上註解忽略這個字段,最好兩個同時加

  • jsonignore是jackson包下的
  • jsonfield是fastjson包下的

有時候分不清就同時加上註解,以防萬一

這個問題應該是我jpa一對多的問題(趕快記錄一下)

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: