将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

开发中需要将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":卡卡


目录
相关文章
|
3月前
|
存储 JSON 前端开发
JSON数组的概念、语法和用法
JSON数组的概念、语法和用法
151 3
|
1月前
|
存储 JSON JavaScript
Python字典和JSON字符串相互转化方法
【2月更文挑战第18天】
59 3
|
17天前
|
JSON 数据格式
Json字符串与QVariantList 对象相互转换
Json字符串与QVariantList 对象相互转换
6 0
|
22天前
使用List中的remove方法遇到数组越界
使用List中的remove方法遇到数组越界
13 2
|
1月前
|
JSON JavaScript PHP
PHP把unicode编码的json字符串转中文
PHP把unicode编码的json字符串转中文
13 0
|
2月前
|
SQL JSON Apache
Flink问题之嵌套 json 中string 数组的解析异常如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
219 1
|
2月前
|
Java
java List数组根据给定大小分割数组
在获取到很长的数组时,一次性处理数据量太大,需要分批处理,这就需要分批处理了。 1、使用List的subList,封装方法 2、google工具类型Lists的partition 经测试个人推荐使用第一种方法,效率上快了10几倍,估计是因为没有重新生成数组的原因
38 8
|
3月前
|
JSON PHP 数据格式
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
|
3月前
|
JSON JavaScript Android开发
JS生成JSON字符串---autojs pro 篇
JS生成JSON字符串---autojs pro 篇
25 0
|
3月前
|
XML JSON 前端开发
教你怎么用ajax传数组(也可以是转为json)
教你怎么用ajax传数组(也可以是转为json)
33 0