json数据转换异常之 java.lang.reflect.InvocationTargetException

时间:2021-04-03 19:53:05

        又是好久没有动静了,一直忙着项目的研发,有时候遇到了烦人的bug和异常时也没有时间去好好研究分析原因。现在有时间就赶紧把自己在项目中遇到的问题和大家分享下,可能这其中有很多对于大神来说都不够成bug范围内,但是对于本人来说,新手上路,还是需要总结与记录,加强一下json数据转换异常之 java.lang.reflect.InvocationTargetException

        好了,还是按照我一贯的习惯,先把问题抛出来:

        项目想做打印页面,需要数据。我的设想是后台取到前端页面值再传到前端,前端取值后拼接到路径上,最后打印页面在从中取数据显示打印。(当然这是本人个人想法方案,可能有更好的方法,并没有求证于大神!)前期使用确实成功了,因为这种操作其实没有通过数据库取值,只需要后台一个接口的“中间商”就搞定了。(当然可能有人会说直接在当前页面打印不行吗?这么折腾干嘛?我只想说,我也想这样,但是打印页面风格差异太大,只能另起炉灶了!)

    在我加入数据库取值后,我要把后台取出的List对象转换为Json识别的数据,而我用的转换类是net.sf.json.JSONObject

突然就不行,报了个异常java.lang.reflect.InvocationTargetException控制台只有这么一句话,什么都没有了,也没有其他的错误日志了。这就让人很头疼了。先是百度了一下遇见的这个问题,也总结了一下网上的经验:

   1、反射的参数不对,内部方法错误,这个原因就是可能自己的方法上没有对应上,好好去检查下,是不是有空指针等原因

   2、也有可能是项目的环境配置问题。(当然,项目都已经上线运行了,这个可以排除了)

   3、包的问题

   4、jdk版本的问题

    其实说了这么多可能性,并不是说我想到的json数据转换异常之 java.lang.reflect.InvocationTargetException,只是为了帮助大家多一些思路,因为我这基本不会是上述所说的问题。

     而我遇到的问题其实就是json转换的时候类型匹配不上的问题了。因为对象内都有除了基本类型的数据,比如Date类型的,那么在对象转json时,JSONObject就无法及时的将Date类型转为Json所支持的类型了。其实网上还有说是数据库里的Date包和后台的date包类型不一致没有延时的问题。

     说了半天,问题排除了,也定位到了原因那么就要解决一下了。在这里就要感谢下编写这篇博客的博主了https://blog.csdn.net/ye1992/article/details/17436765#reply ,我也是在试用了这个博客博主的方法后才有了思路。

        其实在对象转Json中,Java给了一个配置类JsonConfig

JSONObject jsonObject = JSONObject.fromObject(map,config);
System.out.println(jsonObject);
}

1、JsonValueProcessor
Example:
java里面时间类型转换成json数据就成这样了:
"createTime":{"date":30,"day":3,"hours":15,"minutes":14,"month":3,"nanos":0,"seconds":38,"time":1209539678000,"timezoneOffset":-480,"year":108}
期望的结果是"yyyy-mm--dd"
 
  1. 解决方案:使用jsonConfig即可
  2. JsonConfig jsonConfig = new JsonConfig();
  3. jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
2、setIgnoreDefaultExcludes

 
  1. Example:
  2. @SuppressWarnings("unchecked")
  3. public static void testMap() {
  4. Map map = new HashMap();
  5. map.put("name", "json");
  6. map.put("class", "ddd");
  7. JsonConfig config = new JsonConfig();
  8. config.setIgnoreDefaultExcludes(true); //默认为false,即过滤默认的key
3、setCycleDetectionStrategy 防止自包含
 
  1. public static void testUser() {
  2. User object = new User();
  3. object.setMemberId("yajuntest");
  4. object.setSex("male");
  5. JsonConfig jsonConfig = new JsonConfig();
  6. jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
  7. JSONObject json = JSONObject.fromObject(object, jsonConfig);
  8. System.out.println(json);
  9. }
  10. public static void main(String[] args) {
  11. JsonTest.testUser();
  12. }
JsonConfig jsonConfig = new JsonConfig();jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
"createTime":{"date":30,"day":3,"hours":15,"minutes":14,"month":3,"nanos":0,"seconds":38,"time":1209539678000,"timezoneOffset":-480,"year":108}
    4、setExcludes:排除需要序列化成json的属性

    

  1.        String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";  
  2.        JsonConfig jsonConfig = new JsonConfig();  
  3.        jsonConfig.setExcludes(new String[] { "double", "boolean" });  
  4.        JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON(str, jsonConfig);  
  5.        System.out.println(jsonObject.getString("string"));  
  6.        System.out.println(jsonObject.getInt("integer"));  
  7.        System.out.println(jsonObject.has("double"));  
  8.        System.out.println(jsonObject.has("boolean"));
当然还有很多方法,就没必要都填写出来了,最后在把自定义的DateJson贴出来

 
 
  1. package com.tem.json.helper;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import net.sf.json.JsonConfig;
  6. import net.sf.json.processors.JsonValueProcessor;
  7. /**
  8. * 将Bean中的Timestamp、Date转换为json中的日期字符串
  9. * @author
  10. *
  11. */
  12. public class DateJsonValueProcessor implements JsonValueProcessor {
  13. public static final String Default_DATE_PATTERN ="yyyy-MM-dd";
  14. private DateFormat dateFormat ;
  15. public DateJsonValueProcessor(String datePattern){
  16. try{
  17. dateFormat = new SimpleDateFormat(datePattern);}
  18. catch(Exception e ){
  19. dateFormat = new SimpleDateFormat(Default_DATE_PATTERN);
  20. }
  21. }
  22. public Object processArrayValue(Object value, JsonConfig jsonConfig) {
  23. return process(value);
  24. }
  25. public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) {
  26. return process(value);
  27. }
  28. private Object process(Object value){
  29. return dateFormat.format((Date)value);
  30. }
  31. }