我在使用netty时候,由于不同设备发出的JSON字符串不一样,我需要一个动态解析JSON字符串方法去解决,我的思路是先将json字符串通过gson这个类转成map,由于在运行期间无法得知T的具体类型,对这个类的对象进行序列化和反序列化都不能正常进行。Gson通过借助TypeToken类来解决这个问题。
//实例化gson
Gson gson=new Gson();
//实例化TypeToken
Type type=new TypeToken<Map>() {}.getType();
//把json转成map
Map map= gson.fromJson(json,type);
通过迭代器获取map 的所有value值并且赋值给ArrayList存储,因为是动态解析,我无法知道是value什么类型,所以用Object类型,写入数据库时会自动转换
//实例化ArrayList,用来存放value值
ArrayList list = new ArrayList();
//使用Iterator获取map的key与value的集合
Iterator it = map.entrySet().iterator() ;
while (it.hasNext()){
//通过Entry获取key与value
Map.Entry entry = (Map.Entry) it.next() ;
//通过getValue获取value值
Object value = entry.getValue() ;
//把获取的值通过toString方法添加到ArrayList
list.add(value.toString());
}
写入数据库时,我使用了Sql语句拼凑的方式去解决写入问题,因为我的数据前后的String固定,但是中间的数据数目不确定,但是类型一致,所以我使用if判断进行处理,如果进行改造一下,就是有一张表存数据类型,可以在数据存入数据库前,取出数据表类型,然后传入进来进行判断构造SQL语句方式
String sql="INSERT INTO "+数据表名+" VALUES ( null,";
int i=0;
for (Object str : list) {
if(i>0) {
if(i>1) {
if(i>list.size()-2) {
sql=sql+"\""+str.toString()+"\""+",";
}else {
sql= sql+str.toString()+",";
}
}else {
sql=sql+"\""+str.toString()+"\""+",";
}
}
i++;
}
//因为最后多一个,所以使用subString去掉
sql = sql.substring(0,sql.length() - 1);
sql=sql+");";
PreparedStatement pstmt= con.prepareStatement(sql);
return pstmt.executeUpdate();