1. 程式人生 > >動態解析JSON字串,將資料存入資料庫

動態解析JSON字串,將資料存入資料庫

我在使用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();