使用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输出值