將json字符串中數組節點轉換爲泛型list集合(gson)

開發中需要將json中節點單獨取出某個節點,解析獲取數據,此處對json字符串節點中數組節點,轉換爲泛型list集合,使用gson。

google的gson的pom文件和jar:gson

代碼如下

package my.demo.java.z.generic;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**
 * Gson獲取json中的數組節點.<br/>
 * 將數組節點轉換爲list集合<泛型>.<br/>
 * 泛型類,是在實例化類的時候指明泛型的具體類型.<br/>
 * 泛型方法,是在調用方法的時候指明泛型的具體類型.<br/>
 * @author Tony_tian
 * @time 2016-03-15 09:44:32
 * */
public class GenericMethodsJson2List {
	
	public static final String START_ARRAY = "[";
	public static final String END_ARRAY = "]";
	
	/**
	 * Gson獲取json中的數組節點.轉換爲list集合<泛型>.<br/>
	 * @param <T> 聲明一個泛型T
	 * @param List<T> 指明該方法的返回值爲泛型T代表類型的list集合
	 * @param jsonStr json中的數組節點
	 * @param tC 指明泛型T的具體類型,用來創建泛型T代表的類的對象
	 * @return 1:正常返回泛型代表具體類型的list集合,2:轉換錯誤則返回null
	 * */
	@SuppressWarnings("unchecked")
	public static final <T> List<T> json2listT(String jsonStr, Class<T> tC) {
		//json字符串不能爲空
		if(StringUtils.isBlank(jsonStr)) return null;
		//json字符串必須爲數組節點類型
		if(!(jsonStr.startsWith(START_ARRAY) && jsonStr.endsWith(END_ARRAY))) return null;
		List<T> listT = null;
		try {
			//創建泛型對象
			T t =  tC.newInstance();
			//利用類加載加載泛型的具體類型
			Class<T> classT = (Class<T>) Class.forName(t.getClass().getName());
			List<Object> listObj = new ArrayList<Object>();
			//將數組節點中json字符串轉換爲object對象到Object的list集合
			listObj = new GsonBuilder().create().fromJson(jsonStr, new TypeToken<List<Object>>(){}.getType());
			//轉換未成功
			if(listObj == null || listObj.isEmpty()) return null;
			listT = new ArrayList<T>();
			//將Object的list中的的每一個元素中的json字符串轉換爲泛型代表的類型加入泛型代表的list集合返回
			for (Object obj : listObj) {
				T perT = new GsonBuilder().create().fromJson(obj.toString(), classT);
				listT.add(perT);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listT;
	}
	
	
	public static void main(String[] args) {
		String jsonStr = "[{\"username\":\"點點\",\"memberNo\":1},{\"username\":\"didi\",\"memberNo\":2},{\"username\":\"卡卡\",\"memberNo\":3}]";
		List<Member> listp = json2listT(jsonStr, Member.class);
		for (Member member : listp) {
			System.out.println(member.toString());
		}
	}
}

class Member{
	private Integer memberNo;
	private String username;
	
	public Integer getMemberNo() {
		return memberNo;
	}
	
	public String getUsername() {
		return username;
	}
	
	public void setMemberNo(Integer memberNo) {
		this.memberNo = memberNo;
	}
	
	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public String toString() {
		StringBuilder su = new StringBuilder();
		su.append("\"memberNo\"").append(":").append(this.getMemberNo());
		su.append(",").append("\"username\"").append(":").append(this.getUsername());
		return su.toString();
	}
}

main執行結果

"memberNo":1,"username":點點
"memberNo":2,"username":didi
"memberNo":3,"username":卡卡


發佈了155 篇原創文章 · 獲贊 872 · 訪問量 136萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章