1.前言
上次講了簡單的JavaBean和json格式之間的轉換,代碼很簡單,但是實際過程中,往往用到的JavaBean都是比較復雜的,其他的字段還好,如果JavaBean中包含了date類型的字段,就會比較麻煩,今天我們久就來講一下,date類型的字段該如何操作。
2.含有date類型的JavaBean和json之間的轉換
1)首先,我們寫一個含有date類型的JavaBean
1 public class Student { 2 private String name; 3 private Integer age; 4 private Date birthday; 5 }
2)然后,我們對其進行轉換
1 public static void main(String[] arg){ 2 Student student = new Student(); 3 student.setName("litterCoder"); 4 student.setAge(22); 5 student.setBirthday(new Date()); 6 JSONObject jsonObject = JSONObject.fromObject(student); 7 System.out.println(jsonObject); 8 }
3)再將json數據轉換回去,進行輸出
1 public static void main(String[] arg){ 2 String json = "{\"age\":22,\"birthday\":{\"date\":11,\"day\":1,\"hours\":11,\"minutes\":3,\"month\":1,\"seconds\":46,\"time\":1549854226674,\"timezoneOffset\":-480,\"year\":119},\"name\":\"litterCoder\"}"; 3 JSONObject jsonObject = JSONObject.fromObject(json); 4 Student student = (Student) JSONObject.toBean(jsonObject, Student.class); 5 System.out.println(student); 6 }
4)通過輸出的結果,我們可以觀察到,雖然轉換成功了,但是里面還是存在兩個問題。
第一個問題就是轉換成json時的date類型的字段"birthday":{"date":11,"day":1,"hours":11,"minutes":3,"month":1,"seconds":46,"time":1549854226674,"timezoneOffset":-480,"year":119}, 這一大串顯然不太容易看懂,我們最好將他轉換成能夠通俗易懂的格式,例如“birthday”:{“2019.2.11 11:03:46”}。
第二個問題就是json轉換成JavaBean的時候,報了兩個警告,雖然不會影響運行,但是如果我們要根據日志查看某些錯誤或者某些信息的時候,就會造成影響,所以最好是能夠去掉
3.解決問題
1)JavaBean轉換成json字段時,date類型字段指定格式
1.1 首先我們需要一個時間轉化器,在里面定義好你所需要的格式
1 import net.sf.json.JsonConfig; 2 import net.sf.json.processors.JsonValueProcessor; 3 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 import java.util.Locale; 7 8 9 public class JsonDateValueProcessor implements JsonValueProcessor { 10 11 /** 12 * datePattern 13 */ 14 private String datePattern = "yyyy-MM-dd HH:mm:ss"; 15 16 public JsonDateValueProcessor() { 17 super(); 18 } 19 20 public JsonDateValueProcessor(String format) { 21 super(); 22 this.datePattern = format; 23 } 24 25 @Override 26 public Object processArrayValue(Object value, JsonConfig jsonConfig) { 27 return process(value); 28 } 29 30 @Override 31 public Object processObjectValue(String key, Object value, 32 JsonConfig jsonConfig) { 33 return process(value); 34 } 35 36 /** 37 * process 38 * @param value Object 39 * @return Object 40 */ 41 private Object process(Object value) { 42 try { 43 if (value instanceof Date) { 44 SimpleDateFormat sdf = new SimpleDateFormat(datePattern, 45 Locale.UK); 46 return sdf.format((Date) value); 47 } 48 return value == null ? "" : value.toString(); 49 } catch (Exception e) { 50 return ""; 51 } 52 53 } 54 55 public String getDatePattern() { 56 return datePattern; 57 } 58 59 public void setDatePattern(String pDatePattern) { 60 datePattern = pDatePattern; 61 } 62 }
1.2 轉換成json格式
1 public static void main(String[] arg){ 2 Student student = new Student(); 3 student.setName("litterCoder"); 4 student.setAge(22); 5 student.setBirthday(new Date()); 6 JsonConfig config = new JsonConfig(); 7 config.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor()); 8 JSONObject jsonObject = JSONObject.fromObject(student,config); 9 System.out.println(jsonObject); 10 }
首先,我們構造一個JsonConfig,然后調用它的registerJsonValueProcessor方法,將剛剛寫的轉換器設置進去,最后調用JSONObject的fromObject的時候,將config設置進去,我們可以看到結果,時間顯示的很清晰明了
1.3 json轉換成對象
public static void main(String[] arg){ String json = "{\"age\":22,\"birthday\":\"2019-02-11 11:13:05\",\"name\":\"litterCoder\"}"; //日期轉化格式 String[] dateFormats = new String[] {"yyyy-MM-dd HH:mm:ss"}; JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats)); JSONObject jsonObject = JSONObject.fromObject(json); Student student = (Student) JSONObject.toBean(jsonObject, Student.class); System.out.println(student); }
這里需要將之前的時間轉換器內的時間格式設置進來,用於將時間重新轉換回來,可以看到日志中沒有了那兩個警告
3.總結
這就是含有date類型的JavaBean和json字符串之間的轉換,不過其中還存在一點小問題,就是當JavaBean中的字符串為空時,程序會報錯,這個我們就下一篇再討論了