美文网首页Android工具集
Gson转对象和对象集合

Gson转对象和对象集合

作者: Small_Cake | 来源:发表于2017-08-17 11:14 被阅读68次
    package cq.cake.util;
    
    
    import com.google.gson.Gson;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import com.google.gson.reflect.TypeToken;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * MyApplication --  cq.cake.util
     * Created by Small Cake on  2017/8/16 13:35.
     * 需要导入
     * compile 'com.google.code.gson:gson:2.8.1'
     *
     * gsonToList方法可能导致泛型在编译期类型被擦除导致报错,建议使用jsonToList方法
     *
     */
    
    public class GsonUtils {
        private static Gson gson = null;
        static {//静态代码块,是在类中独立于类成员的static语句块,每个代码块只会被执行一次
            if (gson == null) {
                gson = new Gson();
            }
        }
    
        /**
         * 返回List<Object>
         * @param list
         * @param clz
         * @param <T>
         * @return
         */
        @Deprecated
        public static <T> List<T> gsonToList(String list, Class<T> clz){
            List<T> lt = null;
            if (list!=null&&!list.equals("")){
                lt = gson.fromJson(list, new TypeToken<List<T>>(){}.getType());
            }
            return lt;
        }
        /**
         * 转成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;
        }
    
        /**
         * 直接返回Object
         * @param objStr
         * @param clz
         * @param <T>
         * @return
         */
        public static <T> T jsonToObj(String objStr,Class<T> clz){
            T t = null;
            if (objStr!=null) t = gson.fromJson(objStr,clz);
            return t;
        }
    
        /**
         * 转成list中有map的
         *
         * @param gsonString
         * @return
         */
        public static <T> List<Map<String, T>> jsonToListMaps(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> jsonToMaps(String gsonString, Class<T> cls) {
            Map<String, T> map = null;
            if (gson != null) {
                map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
                }.getType());
            }
            return map;
        }
    
      /**
         * 专门针对后台奇葩数据集,明明是数组对象,非要做成map键值对
         * 先转JsonObject,通过再转List
         * @param gsonString
         * @param cls
         * @param <T>
         * @return List<T>
         * 
         * 丢弃掉无用的1,2,3,把后面的value转为对象,再添加到List
         *
         *   "catArr": {
                "1": {
                    "member_cat_id": "11",
                    "member_cat_name": "区县服务中心",
                    "member_cat_amount": "100000.00"
                },
                "2": {
                    "member_cat_id": "12",
                    "member_cat_name": "地市级代理",
                    "member_cat_amount": "500000.00"
                },
                "3": {
                    "member_cat_id": "13",
                    "member_cat_name": "一级代理",
                    "member_cat_amount": "2000000.00"
                }
            }
    
         *
         * @注意 目前缺陷,不能强转类型,比如"100000.00",你在对象中定义此类型为String和double可以,
         * 你知道这个参数肯定是int类型,不会有小数,但如果你定义为int,就会类型转换错误
         * 而gson在外面直接转对象是可以定义为int的,在这里由于用到了泛型T,所以行不通
         *
         */
        public static <T> List<T> jsonToMapsToList(String gsonString, Class<T> cls) {
    
            List<T> list = new ArrayList<T>();
            JsonObject asJsonObject =  new JsonParser().parse(gsonString).getAsJsonObject();
            Set<Map.Entry<String, JsonElement>> entries = asJsonObject.entrySet();
            for (Map.Entry<String, JsonElement> map: entries){
                T t = gson.fromJson(map.getValue(),cls);
                list.add(t);
            }
    
            return list;
        }
    
    }
    
    
    

    相关文章

      网友评论

        本文标题:Gson转对象和对象集合

        本文链接:https://www.haomeiwen.com/subject/dqpgrxtx.html