JSON轉換異常
異常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException & java.lang.NullPointerExcept
異常是在執行下面的語句出現的:
JSONArray array = JSONArray.fromObject(this.users);
出現這bug,有兩種情況:
1、日期格式
2、hibernate延時載入
解決:日期格式
或者JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); jsonConfig.registerJsonBeanProcessor(java.sql.Date.class,new JsDateJsonBeanProcessor());
private java.util.Date createTime;
只在欄位前宣告Date的資料型別可能也會拋異常,在Set,get方法中,有出現Date型別的都把包名加上解決:hibernate延時載入 設定
JsonConfig cfg = new JsonConfig();
cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
還有一個辦法就是建一個 model 類,將需要的資料取出來放到 model 物件中,然後把 model 物件轉換成 json 物件
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
JSONObject轉成JSON--講Date轉換為指定格式
專案中,經常會用JSONObject外掛將JavaBean或List<JavaBean>轉換為JSON格式的字串,而JavaBean的屬性有時候會有java.util.Date這個型別的時間物件,這時JSONObject預設會將Date屬性轉換成這樣的格式:
Html程式碼-
{"nanos":0,"time":-27076233600000,"minutes":0,"seconds":0,"hours":0,"month":11,"timezoneOffset":-480,"year":-789,"day":5,"date":22}
而這種格式肯定是非常難以理解的,為了將Date轉換為我們認識的“yyyy-MM-dd”格式,需要做以下操作。
首先建立一個時間轉換器
Java程式碼- public class JsonDateValueProcessor implements JsonValueProcessor {
- private String format ="yyyy-MM-dd";
- public JsonDateValueProcessor() {
- super();
- }
- public JsonDateValueProcessor(String format) {
- super();
- this.format = format;
- }
- @Override
- public Object processArrayValue(Object paramObject,
- JsonConfig paramJsonConfig) {
- return process(paramObject);
- }
- @Override
- public Object processObjectValue(String paramString, Object paramObject,
- JsonConfig paramJsonConfig) {
- return process(paramObject);
- }
- private Object process(Object value){
- if(value instanceof Date){
- SimpleDateFormat sdf = new SimpleDateFormat(format,Locale.CHINA);
- return sdf.format(value);
- }
- return value == null ? "" : value.toString();
- }
- }
然後在呼叫JSONObject之前建立一個JsonConfig,並且將上一步定義的date轉換器註冊進去:
Java程式碼- JsonConfig jsonConfig = new JsonConfig();
- jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
最後將JsonConfig放入JSONObject物件中,這裡針對不同的資料型別有多種方式放入JsonConfig:
Java程式碼- JSONObject json = new JSONObject();
- //Map轉JSON
- json.putAll(Map, jsonConfig);
或者
Java程式碼- JSONObject json = new JSONObject();
- //JavaBean轉JSON
- json.fromObject(object, jsonConfig)
最後我們看到的結果就是隻要JavaBean中有Date物件,轉換成JSON字串時就會變成“yyyy-MM-dd”格式。