net.sf.json.JSONObject無法處理含有java.util.Date格式的物件
阿新 • • 發佈:2018-12-27
昨天晚上電商的同事突然找我說在我之前寫的那個新執行後臺那邊除了些問題,說圖片載入不出來了,然後我看了下請求返回程式碼,500了!就跑去看了日誌,日誌上報了這樣的異常
[26/17:31:25 WARN] Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: null object; nested exception is com.fasterxml.jackson.databind.JsonMappingException: null object (through reference chain: com.zhilehuo.clinic.op.response.ResponseObject$Success["data"]->net.sf.json.JSONObject["recommendationItem"]->net.sf.json.JSONObject["applyUseEnd"])
看起來有點懵,但是從報錯資訊上可以明確一點就是在JsonObject那裡出了問題
然後我拿了最新的程式碼在本地除錯了一次,發現我之前寫的這個實體類,同事在下面添加了3個成員變數,其中有兩個成員變數的型別是Date型別的,其中有一個就上上面寶座資訊裡面最後一個名為applyUseEnd的這個成員變數。
除錯中,發現JsonObject在將recommendationItem這個物件轉為json時,其中Date型別的成員變數就就解析不出來,導致這個物件都無法轉化為json物件。
找到是這個原因導致的後,經過度娘看到其他小夥伴們遇到這個問題時用了JsonConfig來幫助json處理Date型別的資料。
package com.zhilehuo.clinic.op.dto; import lombok.Data; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** * @Author :Lipanpan * 處理 net.sf.json.JSONObject無法處理java.util.Date格式的物件造成的報錯 */ @Data public class JsonDateValueProcessor implements JsonValueProcessor { private String datePattern = "yyy-MM-dd"; public JsonDateValueProcessor(){ super(); } public JsonDateValueProcessor(String format){ super(); this.datePattern = format; } @Override public Object processArrayValue(Object o, JsonConfig jsonConfig) { return process(o); } @Override public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) { return process(o); } private Object process(Object value) { try { if (value instanceof Date) { SimpleDateFormat sdf = new SimpleDateFormat(datePattern, Locale.UK); return sdf.format((Date) value); } return value == null ? "" : value.toString(); } catch (Exception e) { return ""; } } }
寫好了後,在這個需要轉成json的物件這樣寫:
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor());
RecommendationItem recommendationItem = recommendationItemMapper.getById(itemId);
JSONObject recommendationItemJson = JSONObject.fromObject(recommendationItem,jsonConfig);
這樣就成功解決了 net.sf.json.JSONObject無法處理含有java.util.Date格式的物件的問題,也不知道還有沒有更好的方法去處理,目前就是這樣解決了,如果有更好的方法處理歡迎小夥伴留言告知哦~