问题1:
需求:对象转 json对象 时,如果属性值为null的话,无论它的类型是String,Integer,Boolean,Date....,转json对象后,它的属性值都要为null,而不是默认的 “” 或者0。如此需求,关键是数据库查询时若为不等于,则排除不等于还排除了null(实际上是从""及许多非null值中找满足不等于这个条件).但elasticsearch查询果不等于就是不等于。而且把数据库存es时,所有的null属性值都被转为 "" 了。
疑惑:在网上没有找到现成的工具或者方法。有的可以实现如此需求,但不支持数组。
解决方法:在同事的指导下,直接修改 net.sf.json.JSONObject 的源码,问题解决。
详细说明:
1.找到 json-lib-2.4-jdk15.jar 的源码包,解压,把源码拷到本项目下,然后启动项目,并打断点。
2.跟踪转json对象时它所调用的方法,并分析它对不同类型的null值如何处理。
3.修改。并调试。
4.把能满足需求并修改了的java文件编译后的class文件拷贝到原jar包相应的目录下。
5.再一次测试,同时删除先前拷的源码。
总结及感想:
问题2:1.以后遇到类似的问题时,就可以如此处理。有些工具其实只要修改一点点就完全可以满足要求,也不 需要想得特别神圣,不必望而却步。
2.源码还是经常要看的。关注别人的编码风格及比较好的思路。
转json对象的,Date要转为指定的格式,而不是转为默认的一个日期数组或者其它格式。简单就是:配置config,实现JsonValueProcessor,实现实现两个函数processObjectValue和processArrayValue。
具体见以下源码:
使用时如此写:
private <T> String getJsonString(T obj) {
JsonConfig config = new JsonConfig();
JsonDateValueProcessor jsonValueProcessor = new JsonDateValueProcessor();
config.registerJsonValueProcessor(Date.class, jsonValueProcessor);
JSONObject json = JSONObject.fromObject(obj, config);
return json.toString();
}
JsonDateValueProcessor 类
import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Locale; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; public class JsonDateValueProcessor implements JsonValueProcessor { private String pattern = "yyyy/MM/dd"; public Object processArrayValue(Object value, JsonConfig config) { return process(value); } public Object processObjectValue(String key, Object value, JsonConfig config) { return process(value); } private Object process(Object value) { if (value instanceof Date) { SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.UK); return sdf.format(value); } else if (value == null) { return null; } else { return value.toString(); } } }