解決JSONArray.fromObject方法對DATA的處理
阿新 • • 發佈:2019-02-18
有時候需要給前臺返回一些json資料,或者一個json陣列,通過json為我們提供的fromObject方法可以輕而易舉的完整json資料的封裝,但是但碰到一些聯級屬性(不知這樣說妥不妥)時,例如記錄時間的Date等,直接使用fromObject方法是會報錯的,或者出現結果不是我們需要的格式的資料!
首先引入json的包,自己百度一下就好(我用的是json-lib),今天跟前輩請教時瞭解到了阿里雲的一個fastjson這個包,還沒有去研究,據說很強大,等我研究一下也會寫一篇部落格!(因為我都是一次匯入很多個常用的包的,所以也不截圖了,不過現在也漸漸開始用maven寫專案了)
首先需要實現json為我們提供的JsonValueProcessor介面
package com.loger.test; import java.text.SimpleDateFormat; import java.util.Date; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; public class JsonDateValueProcessor implements JsonValueProcessor { // 定義轉換日期型別的輸出格式 private String format = "yyyy-MM-dd";public JsonDateValueProcessor() { } public JsonDateValueProcessor(String format) { this.format = format; } @Override public Object processArrayValue(Object arg0, JsonConfig arg1) { return process(arg0); } private Object process(Object arg0) { SimpleDateFormat sdf= new SimpleDateFormat(format); return sdf.format(arg0); } @Override public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { if (value instanceof java.util.Date) { String str = new SimpleDateFormat(format).format((Date) value); return str; } if (null != value) { return value.toString(); } return ""; } }
測試JSONArray:(後期說明:這裡我不小心弄錯了,要用大寫的MM,小寫表示分)
package com.loger.test; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.loger.entity.UserDate; import net.sf.json.JSONArray; import net.sf.json.JsonConfig; public class JSONArrayTestForDate { public static List<UserDate> list = new ArrayList<>(); static { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); Date birthday; try { birthday = sdf.parse("1995-09-01"); System.out.println(birthday); list.add(new UserDate("chenle",birthday)); list.add(new UserDate("chenle",birthday)); list.add(new UserDate("chenle",birthday)); list.add(new UserDate("chenle",birthday)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor()); JSONArray jsonArray = JSONArray.fromObject(list,jsonConfig); System.out.println(jsonArray); } }
執行結果:
可以看到,日期已經按照指定的型別輸出
測試JSONObject:
package com.loger.test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import com.loger.entity.UserDate; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; public class JSONObjectTestForDate { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); UserDate user = new UserDate("chenle",sdf.parse("1995-09-01")); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor()); JSONObject jsonObject = new JSONObject(); jsonObject = JSONObject.fromObject(user,jsonConfig); System.out.println(jsonObject); } }
執行結果:
下面在測試不處理格式的結果:
不處理的結果也是這樣的
另外說一下:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); User user = new User("chenle",sdf.parse("1995-09-01"));
日期的輸入要用到以上格式,new Date("1995-09-01")這種方式顯示已過期,而且會報錯!