動態解析JSON字串,將資料存入資料庫
阿新 • • 發佈:2018-12-13
我在使用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();