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中的字符串为空时,程序会报错,这个我们就下一篇再讨论了