使用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。
推薦閱讀:
- java比較兩個json文件的差異及說明
- Java使用fastjson對String、JSONObject、JSONArray相互轉換
- 如何修改JSON字符串中的敏感信息
- 使用@PathVariable註解如何實現動態傳值
- JSONObject按put順序排放與輸出方式