Gson进阶

本文详细介绍了Gson库中各类核心组件的使用方法,包括Gson、JsonParser、JsonElement等,展示了如何通过Gson进行JSON数据的解析、转换及错误处理。提供了丰富的示例代码,如将对象转换为JSON字符串、从JSON字符串解析对象、处理泛型解析错误等。

1、类梳理:

https://github.com/google/gson

gson-deserialiser-example

  • Gson类:解析json的最基础的工具类
  • JsonParser类:解析器来解析JSON到JsonElements的解析树
  • JsonElement类:抽象类(见下图);
  • JsonObject类:JsonElement的Map集合。
LinkedTreeMap<String, JsonElement> members =
      new LinkedTreeMap<String, JsonElement>();
  • JsonArray类:JsonElement的List集合。
List<JsonElement> elements;
  • JsonPrimitive:A class representing a Json primitive value. 基本类型。
  • TypeToken类:用于创建type,比如泛型List<?>

2、JsonElement

JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement这个抽象类的子类。

JsonElement的简单说明 (荐)

image

3、JsonParser

Gson的JsonParser使用

4、数据解析

Gson的解析Json数据的两种方式

用GSON 五招之内搞定任何JSON数组

public class GsonUtil {
    /**
     * 把modelA对象的属性值赋值给bClass对象的属性。
     *
     * @param modelA
     * @param bClass
     * @param <T>
     * @return
     */
    public static <A, T> T modelAconvertoB(A modelA, Class<T> bClass) {
        try {
            Gson gson = new Gson();
            String gsonA = gson.toJson(modelA);
            T instanceB = gson.fromJson(gsonA, bClass);
            return instanceB;
        } catch (Exception e) {
            return null;
        }
    }

    public static String toJson(Object obj) {
        return new Gson().toJson(obj);
    }

    /**
     * Gson泛型解析Json报错:com.google.gson.internal.LinkedTreeMap cannot be cast to test.UserBean
     *
     * @param jsonString
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> List<T> getObjectList(String jsonString, Class<T> cls) {
        if (TextUtils.isEmpty(jsonString)) {
            LegoLog.w("json转换异常,jsonString is null");
            return new ArrayList<>();
        }
        List<T> list = new ArrayList<>();
        try {
            Gson gson = new Gson();
            JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
            for (JsonElement jsonElement : arry) {
                list.add(gson.fromJson(jsonElement, cls));
            }
        } catch (Exception e) {
            LegoLog.e(e.getMessage(), e);
        }
        return list;
    }

    public static <T> Set<T> getObjectSet(String jsonString, Class<T> cls) {
        Set<T> list = new HashSet<>();
        try {
            Gson gson = new Gson();
            JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
            for (JsonElement jsonElement : arry) {
                list.add(gson.fromJson(jsonElement, cls));
            }
        } catch (Exception e) {
            LegoLog.e(e.getMessage(), e);
        }
        return list;
    }

    public static <T> T fromJson(String json, TypeToken<T> token) {
        return new Gson().fromJson(json, token.getType());
    }

    public static <T> T fromJson(String json, Class<T> clazz) {
        return new Gson().fromJson(json, clazz);
    }

    /**
     * 转成json类型
     *
     * @param object
     * @return
     */
    public static String toGsonString(Object object) {
        String gsonString;
        Gson gson = new Gson();
        gsonString = gson.toJson(object);
        return gsonString;
    }

    /**
     * 将Object类型的json返回值,转换成 JsonObject
     *
     * @param objectJson
     * @return
     */
    public static JsonObject toJsonObject(Object objectJson) {
        String jsonStr = toGsonString(objectJson);
        if (TextUtils.isEmpty(jsonStr)) {
            throw new RuntimeException("json字符串");
        }

        JsonElement jsonElement = new JsonParser().parse(jsonStr);
        if (jsonElement.isJsonNull()) {
            throw new RuntimeException("得到的jsonElement对象为空");
        }

        JsonObject jsonObject = jsonElement.getAsJsonObject();
        return jsonObject;
    }


    /**
     * 转成bean
     */
    public static <T> T GsonToBean(String gsonString, Class<T> cls) {
        T t = new Gson().fromJson(gsonString, cls);
        return t;
    }

    public static <T> T GsonToBean(JsonObject jsonObject, Class<T> cls) {
        String gsonString = String.valueOf(jsonObject);//可以
//        String gsonString2 = toGsonString(jsonObject);//可以
//        String gsonString3 = jsonObject.toString();//不支持这种写法

        return GsonToBean(gsonString, cls);
    }

}
public void onSuccess(Object result) {
    super.onSuccess(result);
    JsonObject jsonObject = GsonUtil.toJsonObject(result);
    //是否具有整改下发权限(大队、支队角色)
    boolean zgxfFlag = jsonObject.get("zgxfFlag").getAsBoolean();
    SpUtil.setZgxf(zgxfFlag);

    JsonObject object = jsonObject.get("user").getAsJsonObject();
    User user = GsonUtil.GsonToBean(object, User.class);
    SpUtil.setUser(user);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值