欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-10 15:19:34
...

        又是好久没有动静了,一直忙着项目的研发,有时候遇到了烦人的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. }