gson的工具類

package com.nohttp.utils;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.JsonSyntaxException;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
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.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/*
* @date 創建時間 2017/7/3
* @author  yuansk
* @Description   gson的解析
* @version  1.1
*/
public class GsonUtils
{


    private static Gson gson = null;


    static {
        if (gson == null) {
            gson = new GsonBuilder()
                    .registerTypeAdapter(Long.class,new LongDefault0Adapter())
                    .registerTypeAdapter(long.class,new LongDefault0Adapter())
                    .registerTypeAdapter(Double.class,new DoubleDefault0Adapter())
                    .registerTypeAdapter(double.class,new DoubleDefault0Adapter())
                    .registerTypeAdapter(int.class,new IntegerDefault0Adapter())
                    .registerTypeAdapter(Integer.class,new IntegerDefault0Adapter())
                    .registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
        }
    }




    private GsonUtils() {


    }


    public static class IntegerDefault0Adapter implements JsonSerializer<Integer>, JsonDeserializer<Integer>
    {
        @Override
        public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try {
                if (json.getAsString().equals("") || json.getAsString().equals("null")) {
                    // /定義爲int類型,如果後臺返回""或者null,則返回0
                   return 0;
                }
            } catch (Exception ignore) {
            } finally {
                try {
                    return json.getAsInt();
                } catch (NumberFormatException e) {
                    throw new JsonSyntaxException(e);
                }
            }
        }


        @Override
        public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(src);
        }
    }




        public static class DoubleDefault0Adapter implements JsonSerializer<Double>, JsonDeserializer<Double> {
        @Override
        public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try {
                if (json.getAsString().equals("") || json.getAsString().equals("null")) {
                    //定義爲double類型,如果後臺返回""或者null,則返回0.00
                    //
                    return 0.00;
                }
            } catch (Exception ignore) {
            }finally {
                try {
                    return json.getAsDouble();
                } catch (NumberFormatException e) {
                    throw new JsonSyntaxException(e);
                }
            }
        }


        @Override
        public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(src);
        }


}




        public static  class LongDefault0Adapter implements JsonSerializer<Long>, JsonDeserializer<Long>
    {
        @Override
        public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try {
                if (json.getAsString().equals("") || json.getAsString().equals("null")) {
                    //定義爲long類型,如果後臺返回""或者null,則返回0
                    return 0L;
                }
            } catch (Exception ignore) {


            }finally {
                try {
                    return json.getAsLong();
                } catch (NumberFormatException e) {
                    throw new JsonSyntaxException(e);
                }
            }


        }


        @Override
        public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(src);
        }
}




public static class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory
{
    @SuppressWarnings("unchecked")
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        Class<T> rawType = (Class<T>) type.getRawType();
        if (rawType != String.class) {
            return null;
        }
        return (TypeAdapter<T>) new StringNullAdapter();
    }
}


public static class StringNullAdapter extends TypeAdapter<String>
{
    @Override
    public String read(JsonReader reader) throws IOException {
        // TODO Auto-generated method stub
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull();
            return "";
        }
        return reader.nextString();
    }


    @Override
    public void write(JsonWriter writer, String value) throws IOException {
        // TODO Auto-generated method stub
        if (value == null) {
            writer.nullValue();
            return;
        }
        writer.value(value);
    }


}


    //忽略字段id
    public static Gson getSkipIdGson() {
        Gson gson = new GsonBuilder().setExclusionStrategies(
                new ExclusionStrategy()
                {
                    @Override
                    public boolean shouldSkipField(FieldAttributes f) {
                        //過濾掉字段名包含"id","address"的字段
                        return f.getName().equals("id");
                    }


                    @Override
                    public boolean shouldSkipClass(Class<?> clazz) {
                        // 過濾掉 類名包含 Bean的類
                        return false;
                    }
                }).create();
        return gson;
    }


    public static Gson getSkipIdAndGroupIdGson() {
        Gson gson = new GsonBuilder().setExclusionStrategies(
                new ExclusionStrategy()
                {
                    @Override
                    public boolean shouldSkipField(FieldAttributes f) {
                        //過濾掉字段名包含"id","address"的字段
                        return f.getName().equals("id") | f.getName().equals("groupGuid");
                    }


                    @Override
                    public boolean shouldSkipClass(Class<?> clazz) {
                        // 過濾掉 類名包含 Bean的類
                        return false;
                    }
                }).create();
        return gson;
    }


    /**
     * 將object對象轉成json字符串
     *
     * @param object
     * @return
     */
    public static String gsonString(Object object) {
        String gsonString = null;
        if (gson != null) {
            gsonString = gson.toJson(object);
        }
        return gsonString;
    }




    /**
     * 將gsonString轉成泛型bean
     *
     * @param gsonString
     * @param cls
     * @return
     */
    public static <T> T gsonToBean(String gsonString, Class<T> cls) {
        T t = null;
        if (gson != null) {
            t = gson.fromJson(gsonString, cls);
        }
        return t;
    }




    /**
     * 轉成list
     * 泛型在編譯期類型被擦除導致報錯
     *
     * @param gsonString
     * @param cls
     * @return
     */
    public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {
        List<T> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString, new TypeToken<List<T>>()
            {
            }.getType());
        }
        return list;
    }




    /**
     * 轉成list
     * 解決泛型問題
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> jsonToList(String json, Class<T> cls) {
        Gson gson = new Gson();
        List<T> list = new ArrayList<T>();
        JsonArray array = new JsonParser().parse(json).getAsJsonArray();
        for (final JsonElement elem : array) {
            list.add(gson.fromJson(elem, cls));
        }
        return list;
    }




    /**
     * 轉成list中有map的
     *
     * @param gsonString
     * @return
     */
    public static <T> List<Map<String, T>> GsonToListMaps(String gsonString) {
        List<Map<String, T>> list = null;
        if (gson != null) {
            list = gson.fromJson(gsonString,
                    new TypeToken<List<Map<String, T>>>()
                    {
                    }.getType());
        }
        return list;
    }




    /**
     * 轉成map的
     *
     * @param gsonString
     * @return
     */
    public static <T> Map<String, T> gsonToMaps(String gsonString) {
        Map<String, T> map = null;
        if (gson != null) {
            map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>()
            {
            }.getType());
        }
        return map;
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章