一个json string和泛型对象转换的经典实例

简介:
花了我三个多小时(java还需要努力啊);
只有我自己看得懂,哈哈!!!!
/**elbert.chenh寫於2010年1月5日晚
  * 实现如下功能
  * 1.将用户传递的个性化的jsonstr队列转换为标准化的统一的jsonstr队列
  *   如队列中的元素{\"taskId\":\"t01\",\"sceneId\":\"s01\",\"caseId\":\"cs01\",\"SYNOPSIS\":\"p1\",\"id\":1,\"cpu\":\"cpu01\"}
  *   转化为标准化元素{\"taskId\":\"t01\",\"sceneId\":\"s01\",\"caseId\":\"cs01\",\"param1\":\"p1\",\"id\":1,\"param10\":\"cpu01\"}
  * 2.将队列中的jsonstr转换为对应的类实例
  * 3.调用插入数据库函数将结果插入数据库中 
  * @param jstrCaseLog
  */
 public void insertCaseLog(String jstrCaseLog)
 {
  List<Object> ls = com.alisoft.testplat.help.JsonFunc.fromJSON(
    jstrCaseLog, ArrayList.class);
  //取得数据库中所有的LogParam
  TestCaseService tss = new TestCaseService();
  List<LogParam> lp = tss.getLogParamList();
  List<LinkedHashMap> lstmp = new ArrayList<LinkedHashMap>();
  LinkedHashMap map = new LinkedHashMap();
  for (int i = 0; i < ls.size(); i++) {
   map = (LinkedHashMap) ls.get(i);
   for (int j = 0; j < map.keySet().size(); j++) {
    //使用Key去寻找是哪个Param,如果不是那么就返回自己
    for(int k = 0; k < lp.size(); k++)
    {
     LogParam tmplp = lp.get(k);
     //如果传入的参数别名=某条记录的参数别名,那么替换为该参数实际名称
     if(map.keySet().toArray()[j].toString().toLowerCase().equals(tmplp.getParamAlias().toLowerCase()))
     {
      Object value = map.get(map.keySet().toArray()[j]);
      map.remove(map.keySet().toArray()[j]);
      map.put(tmplp.getParamName().toLowerCase(), value);
     }
    }
   }
   lstmp.add(map); 
  }
  String tempstr = com.alisoft.testplat.help.JsonFunc.toJSON(lstmp);
  List<Object> deslp = com.alisoft.testplat.help.JsonFunc.fromJSON(tempstr, ArrayList.class);
  for(int index = 0; index < deslp.size(); index++)
  {
   String cp = getListNode(deslp,index);
   CaseLog tlp = com.alisoft.testplat.help.JsonFunc.fromJSON(cp, CaseLog.class);
   CaseLogDao.InsertCaseLog(tlp);
  }
 }
 
 public String getListNode(List<Object> ls,int index)
 {
  StringBuilder desstr = new StringBuilder("{");
  LinkedHashMap map = new LinkedHashMap();
   map = (LinkedHashMap) ls.get(index);
   for (int j = 0; j < map.keySet().size(); j++) {
     //如果传入的参数别名=某条记录的参数别名,那么替换为该参数实际名臣
    Object key = map.keySet().toArray()[j];
    Object value = map.get(map.keySet().toArray()[j]);
    if(j < (map.keySet().size()-1))
    {
     if (value != null)
     {
      desstr.append("\"").append(key.toString()).append("\":").append("\"").append(value.toString()).append("\"").append(",");
     }
     else
     {
      desstr.append("\"").append(key.toString()).append("\":").append("null").append(",");
     }
    }
    else
    { 
     if (value != null)
     {
      desstr.append("\"").append(key.toString()).append("\":").append("\"").append(value.toString()).append("\"").append("}");
     }
     else
     {
      desstr.append("\"").append(key.toString()).append("\":").append("null").append("}");
     }
    }
   }
  System.out.println(desstr.toString());
  return desstr.toString();
 }
 public static String toJSON(Object obj) {
       StringWriter writer = new StringWriter();
       try {
          mapper.writeValue(writer, obj);
       } catch (JsonGenerationException e) {
          throw new RuntimeException(e);
       } catch (JsonMappingException e) {
          throw new RuntimeException(e);
       } catch (IOException e) {
          throw new RuntimeException(e);
       }
       return writer.toString();
 }
 
 public static <T> T fromJSON(String json, Class<T> clazz) {
       ObjectMapper mapper = new ObjectMapper();
       try {
          return mapper.readValue(json, clazz);
       } catch (JsonParseException e) {
          throw new RuntimeException(e);
       } catch (JsonMappingException e) {
          throw new RuntimeException(e);
       } catch (IOException e) {
          throw new RuntimeException(e);
       }
    }
 
 本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/282606,如需转载请自行联系原作者
相关文章
|
6月前
|
JSON IDE Java
鸿蒙开发:json转对象插件回来了
首先,我重新编译了插件,进行了上传,大家可以下载最新的安装包进行体验了,还是和以前一样,提供了在线版和IDE插件版,两个选择,最新的版本,除了升级了版本,兼容了最新的DevEco Studio ,还做了一层优化,就是针对嵌套对象和属性的生成,使用方式呢,一年前的文章中有过详细的概述,这里呢也简单介绍一下。
229 4
鸿蒙开发:json转对象插件回来了
|
存储 Java
构造String问题之构造一个Trusted MethodHandles.Lookup实例,如何实现
构造String问题之构造一个Trusted MethodHandles.Lookup实例,如何实现
110 1
|
9月前
|
Java 开发者
课时45:String对象常量池
本次课程的主要讨论了对象池的概念及其在Java开发中的应用。首先,介绍了静态常量池和运行时常量池的区别。讨论了静态常量池和运行时常量池在实际开发中的作用,以及如何理解和应用这些概念。 1.常量池的分类 2.静态常量池和运行时常量池的区别
103 1
|
9月前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
167 1
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1245 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
280 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
1927 7
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
142 3