jsonlib中jsonConfig的配置

前端之家收集整理的这篇文章主要介绍了jsonlib中jsonConfig的配置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。



目录(?)[+]

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


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


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

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

  1. jsonConfig.registerDefaultValueProcessor(Integer.class,
  2. newDefaultValueProcessor(){
  3. @Override
  4. publicObjectgetDefaultValue(Classtype){
  5. returnnull;
  6. }
  7. });

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

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

  1. publicstaticvoidmain(String[]args){
  2. JsonConfigjsonConfig=newJsonConfig();
  3. jsonConfig.registerDefaultValueProcessor(Integer.class,
  4. newDefaultValueProcessor(){
  5. @SuppressWarnings("unchecked")
  6. @Override
  7. publicObjectgetDefaultValue(Classtype){
  8. return"";
  9. }
  10. });
  11. Employeeemployee=newEmployee();
  12. employee.setName("zhu");
  13. employee.setRole(1);
  14. System.out.println(JSONObject.fromObject(employee));
  15. System.out.println(JSONObject.fromObject(employee,jsonConfig));
  16. }

输出为:

  1. {"depno":"","empno":"","groupno":0,"name":"zhu","online":0,"phone":"","role":1}
  2. {"depno":"","groupno":null,"online":null,"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. <prename="code"class="java">publicObjectprocessObjectValue(StringparamString,ObjectparamObject,JsonConfigparamJsonConfig);
  2. publicObjectprocessArrayValue(ObjectparamObject,JsonConfigparamJsonConfig);


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

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

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

  1. publicstaticvoidmain(String[]args){
  2. JsonConfigjsonConfig=newJsonConfig();
  3. jsonConfig.registerJsonValueProcessor(Date.class,
  4. newJsonValueProcessor(){
  5. /**
  6. *paramString->参数名paramObject->参数值
  7. */
  8. @Override
  9. publicObjectprocessObjectValue(StringparamString,
  10. ObjectparamObject,JsonConfigparamJsonConfig){
  11. if(paramObject==null){
  12. returnnull;
  13. }
  14. Stringret=null;
  15. try{
  16. SimpleDateFormatformat=newSimpleDateFormat(
  17. "yyyy-MM-ddHH:mm:ss");
  18. ret=format.format((Date)paramObject);
  19. }catch(Exceptione){
  20. SimpleDateFormatformat=newSimpleDateFormat(
  21. "yyyy-MM-dd");
  22. ret=format.format((Date)paramObject);
  23. }
  24. returnret;
  25. }
  26. @Override
  27. publicObjectprocessArrayValue(ObjectparamObject,
  28. JsonConfigparamJsonConfig){
  29. returnnull;
  30. }
  31. });
  32. Employeeemployee=newEmployee();
  33. employee.setName("zhu");
  34. employee.setRole(1);
  35. employee.setBirthday(newDate());
  36. System.out.println("nojsonConfig:"+JSONObject.fromObject(employee));
  37. System.out.println("withjsonConfig:"+JSONObject.fromObject(employee,jsonConfig));
  38. }

输出结果是:
  
  
[plain] view plain copy
  1. nojsonConfig:{"birthday":{"date":24,"hours":13,"minutes":46,"seconds":31,"time":1419399991491,"year":114},"depno":"","role":1}
  2. withjsonConfig:{"birthday":"2014-12-2413:46:31","role":1}


过滤需要序列化的属性


过滤某些不必要序列化的属性有两种方式: 1、给定一个过滤条件,若满足则被过滤掉2、直接指定需要过滤的属性
先来看看第一种:
  1. publicstaticvoidmain(String[]args){
  2. JsonConfigjsonConfig=newJsonConfig();
  3. jsonConfig.setJsonPropertyFilter(newPropertyFilter(){
  4. @Override
  5. publicbooleanapply(Objectsource,Stringname,Objectvalue){
  6. returnvalue==null;
  7. }
  8. });
  9. Employeeemployee=newEmployee();
  10. employee.setName("zhu");
  11. employee.setRole(1);
  12. System.out.println("nojsonConfig:"+JSONObject.fromObject(employee));
  13. System.out.println("withjsonConfig:"+JSONObject.fromObject(employee,jsonConfig));
  14. }

输出结果是:

  
  
[plain] view plain copy
  1. nojsonConfig:{"birthday":null,"role":1}
  2. withjsonConfig:{"name":"zhu","role":1}

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

  1. publicstaticvoidmain(String[]args){
  2. JsonConfigjsonConfig=newJsonConfig();
  3. jsonConfig.setExcludes(newString[]{"depno","empno","groupno",
  4. "online"});
  5. Employeeemployee=newEmployee();
  6. employee.setName("zhu");
  7. employee.setRole(1);
  8. System.out.println("nojsonConfig:"+JSONObject.fromObject(employee));
  9. System.out.println("withjsonConfig:"
  10. +JSONObject.fromObject(employee,jsonConfig));
  11. }

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

输出结果:

  1. nojsonConfig:{"birthday":null,"role":1}
  2. withjsonConfig:{"birthday":null,"role":1}

猜你在找的Json相关文章