JavaBean和json数据之间的转换含有date类型的JavaBean

Posted litterCoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaBean和json数据之间的转换含有date类型的JavaBean相关的知识,希望对你有一定的参考价值。

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

 

 

    

    

以上是关于JavaBean和json数据之间的转换含有date类型的JavaBean的主要内容,如果未能解决你的问题,请参考以下文章

IDEA使用GsonFormat完成JSON和JavaBean之间的转换

FastJson JSON对象及JavaBean之间的相互转换

FastJson学习:JSON格式字符串JSON对象及JavaBean之间的相互转换

SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换

有两个地方,用到了javabean对象和属性字符串值之间的转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换