A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 不二晨 金牌黑马   /  2019-3-11 14:11  /  1276 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题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.再一次测试,同时删除先前拷的源码。

  总结及感想:

  1.以后遇到类似的问题时,就可以如此处理。有些工具其实只要修改一点点就完全可以满足要求,也不 需要想得特别神圣,不必望而却步。

  2.源码还是经常要看的。关注别人的编码风格及比较好的思路。

问题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();
                }
        }
}

---------------------
【转载,仅作分享,侵删】
作者:xinyuebaihe
原文:https://blog.csdn.net/xinyuebaihe/article/details/77657776
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马