jsonlib中jsonConfig的配置



目录(?)[+]

json-lib的普及率应该还是比较广的,不过在spring中倒是倾向于jackson,无奈新项目做到一般才知道jackson,所以还是依旧使用了json-lib~


改变某种类型默认值的序列化值


在序列化的时候,比较常见的问题是数据库为null的int型字段,被序列化后就赋值成0了,这在有些时候不是我们想看到的结果,那怎么办呢?

json-lib提供了JsonConfig对象供我们来自定义一些序列化时的操作:

  1. jsonConfig.registerDefaultValueProcessor(Integer.class,  
  2.         new DefaultValueProcessor() {  
  3.             @Override  
  4.             public Object getDefaultValue(Class type) {  
  5.                 return null;  
  6.             }  
  7.         });  

也就是说,对于需要 序列化的对象的Integer的字段来说,只要值为null(也就是Integer的默认值),那么在序列化成json的时候,该key的value则也会为null

我们可以通过以下代码测试一下:

  1. public static void main(String[] args) {  
  2.     JsonConfig jsonConfig = new JsonConfig();  
  3.     jsonConfig.registerDefaultValueProcessor(Integer.class,  
  4.             new DefaultValueProcessor() {  
  5.                 @SuppressWarnings("unchecked")  
  6.                 @Override  
  7.                 public Object getDefaultValue(Class type) {  
  8.                     return "";  
  9.                 }  
  10.             });  
  11.   
  12.     Employee employee = new Employee();  
  13.     employee.setName("zhu");  
  14.     employee.setRole(1);  
  15.     System.out.println(JSONObject.fromObject(employee));  
  16.     System.out.println(JSONObject.fromObject(employee, jsonConfig));  
  17. }  

输出为:

  1. {"depno":"","empno":"","groupno":0,"name":"zhu","online":0,"phone":"","role":1}  
  2. {"depno":"","empno":"","groupno":null,"name":"zhu","online":null,"phone":"","role":1}  


改变某种类型的序列化策略


考虑在序列化的时候我们可能并不想原模原样的照着 对象 的值来序列化,也许我们想要玩点花样?比如加个密啊,或者加个格式化的策略

就拿Date类型来说吧,如果说按照默认的序列化策略,看看会是什么结果:

{"birthday":{"date":24,"day":3,"hours":11,"minutes":33,"month":11,"seconds":4,"time":1419391984356,"timezoneOffset":-480,"year":114}}

我想大多数情况下你应该不会是想要这种结果吧?格式化成“yyyy-MM-dd”这种格式也许是最常见的

那么我们可以通过为Date类型的字段配置一个我们自己的Processor:

首先,我们需要实现JsonValueProcessor接口,这个接口有两个方法需要实现:

  1. <pre name="code" class="java">public Object processObjectValue(String paramString,Object paramObject, JsonConfig paramJsonConfig);  
  2.   
  3. public Object processArrayValue(Object paramObject,JsonConfig paramJsonConfig);  


当对象的某个属性是该类型时,那么调用processObjectValue(...)方法来序列化该属性

而当对象的某个属性是该类型的数组或List时,那么调用processArrayValue(...)方法来序列化该属性

知道了这个,下面我们就来实现序列化中Date类型的格式化吧,这里对于Date的数组类型就不处理了,直接返回null:

  1. public static void main(String[] args) {  
  2.     JsonConfig jsonConfig = new JsonConfig();  
  3.     jsonConfig.registerJsonValueProcessor(Date.class,  
  4.             new JsonValueProcessor() {  
  5.   
  6.                 /** 
  7.                  * paramString -> 参数名 paramObject -> 参数值 
  8.                  */  
  9.                 @Override  
  10.                 public Object processObjectValue(String paramString,  
  11.                         Object paramObject, JsonConfig paramJsonConfig) {  
  12.                     if (paramObject == null) {  
  13.                         return null;  
  14.                     }  
  15.                     String ret = null;  
  16.                     try {  
  17.                         SimpleDateFormat format = new SimpleDateFormat(  
  18.                                 "yyyy-MM-dd HH:mm:ss");  
  19.                         ret = format.format((Date) paramObject);  
  20.                     } catch (Exception e) {  
  21.                         SimpleDateFormat format = new SimpleDateFormat(  
  22.                                 "yyyy-MM-dd");  
  23.                         ret = format.format((Date) paramObject);  
  24.                     }  
  25.                     return ret;  
  26.                 }  
  27.   
  28.                 @Override  
  29.                 public Object processArrayValue(Object paramObject,  
  30.                         JsonConfig paramJsonConfig) {  
  31.                     return null;  
  32.                 }  
  33.             });  
  34.     Employee employee = new Employee();  
  35.     employee.setName("zhu");  
  36.     employee.setRole(1);  
  37.     employee.setBirthday(new Date());  
  38.     System.out.println("no jsonConfig:" + JSONObject.fromObject(employee));  
  39.     System.out.println("with jsonConfig:" + JSONObject.fromObject(employee, jsonConfig));  
  40. }  

输出结果是:
  
  
[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. no jsonConfig:{"birthday":{"date":24,"day":3,"hours":13,"minutes":46,"month":11,"seconds":31,"time":1419399991491,"timezoneOffset":-480,"year":114},"depno":"","empno":"","groupno":0,"name":"zhu","online":0,"phone":"","role":1}  
  2. with jsonConfig:{"birthday":"2014-12-24 13:46:31","depno":"","empno":"","groupno":0,"name":"zhu","online":0,"phone":"","role":1}  


过滤需要序列化的属性


过滤某些不必要序列化的属性有两种方式: 1、给定一个过滤条件,若满足则被过滤掉2、直接指定需要过滤的属性名
先来看看第一种:
  1. public static void main(String[] args) {  
  2.         JsonConfig jsonConfig = new JsonConfig();  
  3.         jsonConfig.setJsonPropertyFilter(new PropertyFilter() {  
  4.             @Override  
  5.             public boolean apply(Object source, String name, Object value) {  
  6.                 return value == null;  
  7.             }  
  8.         });  
  9.         Employee employee = new Employee();  
  10.         employee.setName("zhu");  
  11.         employee.setRole(1);  
  12.         System.out.println("no jsonConfig:" + JSONObject.fromObject(employee));  
  13.         System.out.println("with jsonConfig:" + JSONObject.fromObject(employee, jsonConfig));  
  14.     }  

输出结果是:

  
  
[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. no jsonConfig:{"birthday":null,"depno":"","empno":"","groupno":0,"name":"zhu","online":0,"phone":"","role":1}  
  2. with jsonConfig:{"name":"zhu","role":1}  

第二种过滤方式,直接根据属性的名称:

  1. public static void main(String[] args) {  
  2.         JsonConfig jsonConfig = new JsonConfig();  
  3.         jsonConfig.setExcludes(new String[] { "depno""empno""groupno",  
  4.                 "online" });  
  5.         Employee employee = new Employee();  
  6.         employee.setName("zhu");  
  7.         employee.setRole(1);  
  8.         System.out.println("no jsonConfig:" + JSONObject.fromObject(employee));  
  9.         System.out.println("with jsonConfig:"  
  10.                 + JSONObject.fromObject(employee, jsonConfig));  
  11.     }  

可以看到,这里通过jsonConfig.setExcludes(new String[]{"double", "boolean"});将double和boolean这两个属性

输出结果:

  1. no jsonConfig:{"birthday":null,"depno":"","empno":"","groupno":0,"name":"zhu","online":0,"phone":"","role":1}  
  2. with jsonConfig:{"birthday":null,"name":"zhu","phone":"","role":1}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值