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

 

 

    

    

转载于:https://www.cnblogs.com/litterCoder/p/10256594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fastjson是一款高性能的Java JSON处理器,它提供了很多功能实现JSON字符串与Java对象的转换。复杂JSON格式字符串转换JavaBean对象时,需要按照以下的方法进行操作: 首先,我们需要创建一个JavaBean类,属性需要与对应的JSON格式相匹配,可以使用注解或者getter、setter方法来指定属性名。如下面的代码片段所示,我们创建了一个User类。 ```java public class User { private String name; private int age; private List<Address> addressList; // getter、setter、toString方法省略 } ``` 在User类中,我们定义了与JSON格式相对应的属性,其中addressList是一个List类型,它的元素是Address类型,如下所示: ```java public class Address { private String city; private String street; private String zipCode; // getter、setter、toString方法省略 } ``` 接着,我们可以使用fastjson提供的工具类JSON.parseObject()方法将JSON格式字符串转换JavaBean对象。如下所示: ```java String jsonStr = "{\"name\":\"Tom\",\"age\":18,\"addressList\":[{\"city\":\"beijing\",\"street\":\"chaoyang\",\"zipCode\":\"100000\"},{\"city\":\"shanghai\",\"street\":\"pudong\",\"zipCode\":\"200000\"}]}"; User user = JSON.parseObject(jsonStr, User.class); ``` 在上面的代码中,我们首先定义了一个JSON格式字符串,然后使用JSON.parseObject()方法将其转换为User对象。在这个方法的第一个参数中,我们需要传入JSON格式字符串,第个参数是目标JavaBean类型。fastjson会自动将JSON字符串中的属性值赋值给JavaBean对象中的对应属性。如果JSON格式字符串中的属性名称与JavaBean中的属性名称不匹配,我们需要在JavaBean使用@JSONField注解或者getter、setter方法指定对应的属性名。 在将JavaBean对象转换JSON格式字符串时,我们可以使用fastjson提供的工具类JSON.toJSONString()方法。如下所示: ```java String jsonUser = JSON.toJSONString(user); ``` 在上面的代码中,我们将User对象转换JSON格式字符串。 总结来说,通过fastjson将复杂JSON格式字符串转换JavaBean对象需要创建对应的JavaBean类,然后使用JSON.parseObject()方法将JSON字符串转换JavaBean对象。如果需要将JavaBean对象转换JSON字符串,我们可以使用JSON.toJSONString()方法实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值