package com.rdf.web.util;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Gson工具類
*/
public class GsonUtil {
//不用創建對象,直接使用Gson.就可以調用方法
private static Gson gson = null;
//判斷gson對象是否存在了,不存在則創建對象
static {
if (gson == null) {
//當使用GsonBuilder方式時屬性為空的時候輸出來的json字符串是有鍵值key的,顯示形式是"key":null,而直接new出來的就沒有"key":null的
gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
}
}
//無參的私有構造方法
private GsonUtil() {
}
/**
* 將對象轉成json格式
*
* @param object
* @return String
*/
public static String string(Object object) {
String gsonString = null;
if (gson != null) {
gsonString = gson.toJson(object);
}
return gsonString;
}
/**
* 將json轉成特定的cls的對象
*
* @param gsonString
* @param cls
* @return
*/
public static <T> T toBean(String gsonString, Class<T> cls) {
T t = null;
if (gson != null) {
//傳入json對象和對象類型,將json轉成對象
t = gson.fromJson(gsonString, cls);
}
return t;
}
/**
* json字符串轉成list
*
* @param gsonString
* @param cls
* @return
*/
public static <T> List<T> toList(String gsonString) {
Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<List<T>>() {
}.getType(), new MapTypeAdapter()).create();
return gson.fromJson(gsonString, new TypeToken<List<T>>() {
}.getType());
}
/**
* json字符串轉成list中有map的
*
* @param gsonString
* @return
*/
public static <T> List<Map<String, T>> toListMaps(String gsonString) {
Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<List<Map<String, T>>>() {
}.getType(), new MapTypeAdapter()).create();
return gson.fromJson(gsonString,
new TypeToken<List<Map<String, T>>>() {
}.getType());
}
/**
* json字符串轉成map的
*
* @param gsonString
* @return
*/
public static <T> Map<String, T> toMaps(String gsonString) {
Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<Map<String, T>>() {
}.getType(), new MapTypeAdapter()).create();
return gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
}.getType());
}
public static class MapTypeAdapter extends TypeAdapter<Object> {
@Override
public Object read(JsonReader in) throws IOException {
JsonToken token = in.peek();
switch (token) {
case BEGIN_ARRAY:
List<Object> list = new ArrayList<>();
in.beginArray();
while (in.hasNext()) {
list.add(read(in));
}
in.endArray();
return list;
case BEGIN_OBJECT:
Map<String, Object> map = new LinkedTreeMap<>();
in.beginObject();
while (in.hasNext()) {
map.put(in.nextName(), read(in));
}
in.endObject();
return map;
case STRING:
return in.nextString();
case NUMBER:
/**
* 改寫數字的處理邏輯,將數字值分為整型與浮點型。
*/
double dbNum = in.nextDouble();
// 數字超過long的最大值,返回浮點類型
if (dbNum > Long.MAX_VALUE) {
return dbNum;
}
// 判斷數字是否為整數值
long lngNum = (long) dbNum;
if (dbNum == lngNum) {
return lngNum;
} else {
return dbNum;
}
case BOOLEAN:
return in.nextBoolean();
case NULL:
in.nextNull();
return null;
default:
throw new IllegalStateException();
}
}
@Override
public void write(JsonWriter out, Object value) throws IOException {
// 序列化無需實現
}
}
}