如何将JsonElement转换为数组?关于Pojo类作用的技术咨询
你的JSON解析问题,我来帮你梳理清楚
一、先解答你最疑惑的:既然要自己转JSON,为啥还要用POJO?
其实POJO是帮你省力气的!你看接口返回的每个币的信息里,还有嵌套的change对象(包含hour和day涨跌幅),如果不用POJO,你得手动一层层调用getAsJsonObject("change")、get("hour").getAsString()这种代码,不仅写起来麻烦,还容易写错字段名(比如把"symbol"写成"sympol")。
用POJO的话,Gson(你代码里的@SerializedName就是Gson的注解)会自动把JSON里的字段映射到Java对象的属性上,之后你要拿某个币的价格,直接coinstats.getPrice()就行,要拿日涨跌幅就coinstats.getChange().getDay(),代码可读性和维护性都高很多,也不容易出错。
二、怎么把返回的JsonElement转成数组/列表?
你的接口返回的是一个以数字为键的JsonObject,每个键对应的值就是一个Coinstats的JSON对象。咱们要做的就是把这些值提取出来,转成Coinstats对象,再放到列表或者数组里。
方法一:手动遍历JsonObject(适合你当前用Callback<JsonElement>的情况)
假设你已经有Gson实例(如果需要自定义配置,比如只处理带@Expose的字段,可以自己构建):
// 初始化Gson,按需配置 Gson gson = new GsonBuilder() .excludeFieldsWithoutExposeAnnotation() // 可选:只序列化/反序列化带@Expose的字段 .create(); call2.enqueue(new Callback<JsonElement>() { @Override public void onResponse(Call<JsonElement> call, Response<JsonElement> response) { if (response.isSuccessful() && response.body() != null) { JsonObject coinObject = response.body().getAsJsonObject(); List<Coinstats> coinList = new ArrayList<>(); // 遍历JsonObject里的所有键值对 for (Map.Entry<String, JsonElement> entry : coinObject.entrySet()) { // 把每个JSON值转成Coinstats对象 Coinstats coin = gson.fromJson(entry.getValue(), Coinstats.class); coinList.add(coin); } // 现在coinList就是你要的大列表,转成数组也很简单 Coinstats[] coinArray = coinList.toArray(new Coinstats[0]); // 接下来就可以用这个列表/数组做业务逻辑啦 } } @Override public void onFailure(Call<JsonElement> call, Throwable t) { Log.w("no Stats", t.toString()); } });
方法二:让Gson直接帮你转成Map(更简洁)
其实你可以把Call的泛型改成Map<String, Coinstats>,这样Gson会自动把外层的JsonObject转成Map,你直接拿Map的值转成列表就行:
call2.enqueue(new Callback<Map<String, Coinstats>>() { @Override public void onResponse(Call<Map<String, Coinstats>> call, Response<Map<String, Coinstats>> response) { if (response.isSuccessful() && response.body() != null) { Map<String, Coinstats> coinMap = response.body(); // 把Map里的所有值转成列表 List<Coinstats> coinList = new ArrayList<>(coinMap.values()); // 如果需要按1、2、3的顺序排序(因为Map的顺序不一定是按key来的) List<String> sortedKeys = new ArrayList<>(coinMap.keySet()); sortedKeys.sort(Comparator.comparingInt(Integer::parseInt)); List<Coinstats> sortedCoinList = new ArrayList<>(); for (String key : sortedKeys) { sortedCoinList.add(coinMap.get(key)); } // 排序后的列表就可以用啦 } } @Override public void onFailure(Call<Map<String, Coinstats>> call, Throwable t) { Log.w("no Stats", t.toString()); } });
小补充:如果需要按数字key排序
默认的JsonObject或Map遍历顺序不一定是按1、2、3来的,要是你需要保持顺序,就像上面方法二里的那样,把key转成整数排序后再依次取对象就行。
内容的提问来源于stack exchange,提问作者user8875509
相关产品推荐
相关产品推荐

