Gson工具类 Json 转 List<T> Json转 Map Json 转 JsonObject

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

/**
 * Json工具类
 * 
 * @author Val
 *
 */
public class JsonUtils {

	/**
	 * 将对象转换成Json字符串
	 * 
	 * @param src
	 * @return
	 */
	public static String toJson(Object src) {
		return GSON.toJson(src);
	}

	/**
	 * 将Json转换成对象
	 * 
	 * @param json
	 * @param classOfT
	 * @return
	 */
	public static <T> T toEntity(String json, Class<T> classOfT) {
		return GSON.fromJson(json, classOfT);
	}

	/**
	 * 将Json转化成Map
	 * 
	 * @param json
	 * @return
	 */
	public static Map<String, ?> toMap(String json) {
		return GSON.fromJson(json, MAP_TYPE);
	}

	/**
	 * 将Json字符串转化成List
	 * 
	 * @param json
	 * @param typeOfT
	 * @return
	 */
	public static <T> List<T> toList(String json, Class<T> typeOfT) {
		List<JsonObject> jsonObjectList = GSON.fromJson(json, JSON_OBJECT_TYPE);
		List<T> list = new ArrayList<>();
		for (JsonObject jsonObject : jsonObjectList) {
			list.add(toEntity(jsonObject.toString(), typeOfT));
		}
		return list;
	}

	/**
	 * Json字符串转JsonObject
	 * 
	 * @param json
	 * @return
	 */
	public static JsonObject toJsonObject(String json) {
		return JSON_PARSER.parse(json).getAsJsonObject();
	}

	/**
	 * 将JsonObject转换成Json字符串
	 * 
	 * @param src
	 * @return
	 */
	public static String toJson(JsonObject jsonObject) {
		return jsonObject.toString();
	}

	/**
	 * 禁止调用无参构造
	 * 
	 * @throws Exception
	 */
	private JsonUtils() throws Exception {
		throw new Exception("Error...");
	}

	private static final Gson GSON = new Gson();

	private static final JsonParser JSON_PARSER = new JsonParser();

	private static final Type MAP_TYPE = new TypeToken<Map<String, ?>>() {
	}.getType();

	private static final Type JSON_OBJECT_TYPE = new TypeToken<List<JsonObject>>() {
	}.getType();

}

上面是当时孤陋寡闻时写出来的,导致toList和toMap有明显疏漏之处,现补充正确的写法

/**
 * 将Json转化成Map
 *
 * @param json
 * @param typeOfMap
 * @param typeOfKey
 * @param typeOfValue
 * @param <M>
 * @param <K>
 * @param <V>
 * @return
 */
public static <M extends Map<K, V>, K, V> M toMap(String json, Class<M> typeOfMap, Class<K> typeOfKey, Class<V> typeOfValue) {
    Type[] argumentTypes = new Type[]{typeOfKey, typeOfValue};
    Type parameterizedType = ParameterizedTypeImpl.make(typeOfMap, argumentTypes, null);
    return GSON.get().fromJson(json, parameterizedType);
}

/**
 * 将json转化成Collection
 *
 * @param json
 * @param typeOfCollection
 * @param typeOfT
 * @param <C>
 * @param <T>
 * @return
 */
public static <C extends Collection<T>, T> C toCollection(String json, Class<C> typeOfCollection, Class<T> typeOfT) {
    Type[] argumentTypes = new Type[]{typeOfT};
    Type parameterizedType = ParameterizedTypeImpl.make(typeOfCollection, argumentTypes, null);
    return GSON.get().fromJson(json, parameterizedType);
}

 

主要借助了 Type parameterizedType = ParameterizedTypeImpl.make(typeOfMap, argumentTypes, null);来生成带泛型的Type

当然业务代码中复杂类型还是用TypeToken吧

 

@Test
public void testTypeToken() {

    Map<String, User> users = new HashMap<>();

    users.put("user01", new User("user01", 26, 172.0D));
    users.put("user02", new User("user02", 25, 180.0D));

    System.out.println("users:   " + users);

    String json = GsonUtils.toJson(users);
    System.out.println("json:   " + json);

    Map<String, User> users2 = new Gson().fromJson(json, new TypeToken<Map<String, User>>() {
    }.getType());

    System.out.println("users2:   " + users2);

    Assert.assertEquals(users, users2);

}

 

 

转载于:https://my.oschina.net/valsong/blog/661265

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值