使用Gson解析Json为Map对象探索(下)

使用Gson解析Json为Map对象探索(下)

下面来说说其中出现的问题

1.如何获取一个list列表

1.1首先是数据格式
这里写图片描述
1.2处理成列表的代码

com.google.gson.Gson gson = new  com.google.gson.Gson();
        // 先转换成Map对象
        Map<String , Object> map = gson.fromJson(str,Map.class);
        //例如我们想要l1的列表值
        //先获取l1节点的值
       Map<String , Object> aMaps = ( Map<String , Object>) map.get("l1");
       List<Map<String, Object>> maps = new ArrayList<>();
       for (String s : aMaps.keySet()) {
           Map<String, Object> hashMap = new HashMap<>();
           hashMap.put(s,aMaps.get(s));
           maps.add(hashMap);
       }
       System.out.println(maps);
    }

1.3输出的结果
这里写图片描述

2.json是Int类型的时候如何脱坑

2.1在上列中我们看到121这个结果被解析成了121.0
解决方式是重写TypeAdapter
2.2代码:

Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<Map<String, Object>>() {}.getType(), new MyTypeAdapter()).create();
        // 先转换成Map对象
        Map<String , Object> map = gson.fromJson(str,new TypeToken<Map<String, Object>>() {}.getType());
        //例如我们想要l1的列表值
        //先获取l1节点的值
       Map<String , Object> aMaps = ( Map<String , Object>) map.get("l1");
       List<Map<String, Object>> maps = new ArrayList<>();
       for (String s : aMaps.keySet()) {
           Map<String, Object> hashMap = new HashMap<>();
           hashMap.put(s,aMaps.get(s));
           maps.add(hashMap);
       }
       System.out.println(maps);



 static class MyTypeAdapter extends TypeAdapter {
        @Override
        public Object read(JsonReader in) throws IOException {
            JsonToken token = in.peek();
            switch (token) {
                case BEGIN_ARRAY:
                    List<Object> list = new ArrayList<Object>();
                    in.beginArray();
                    while (in.hasNext()) {
                        list.add(read(in));
                    }
                    in.endArray();
                    return list;
                case BEGIN_OBJECT:
                    Map<String, Object> map = new LinkedTreeMap<String, Object>();
                    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;
                    }
                    // 判断数字是否为整数值
                    double eps = 1e-10;  // 精度范围
                    if (dbNum-Math.floor(dbNum) < eps) {
                        return (long) dbNum;
                    } 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 {

        }

    }

2.3输出值
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sinat_29256651/article/details/78660618