有时候需要给前台返回一些json数据,或者一个json数组,通过json为我们提供的fromObject方法可以轻而易举的完整json数据的封装,但是但碰到一些联级属性(不知这样说妥不妥)时,例如记录时间的Date等,直接使用fromObject方法是会报错的,或者出现结果不是我们需要的格式的数据!
首先引入json的包,自己百度一下就好(我用的是json-lib),今天跟前辈请教时了解到了阿里云的一个fastjson这个包,还没有去研究,据说很强大,等我研究一下也会写一篇博客!(因为我都是一次导入很多个常用的包的,所以也不截图了,不过现在也渐渐开始用maven写项目了)
首先需要实现json为我们提供的JsonValueProcessor接口,指定Date类型的处理方式!代码来自百度
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")这种方式显示已过期,而且会报错!