整数和双精度之间的json标准没有区别,只有数字类型.这就是为什么gson默认情况下会将数字转换为双精度,如果你不给他你想要的类型.
简单的解决方法是使用TypeToken并将数据结构更改为多个数组或自定义对象(如@totoro demo).
new Gson().fromJson(levelPatternGson, new TypeToken>() {}.getType());
但您也可以编写自定义List反序列化器:
public static class ListDeserializerDoubleAsIntFix implements JsonDeserializer{
@Override @SuppressWarnings("unchecked")
public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return (List) read(json);
}
public Object read(JsonElement in) {
if(in.isJsonArray()){
List list = new ArrayList();
JsonArray arr = in.getAsJsonArray();
for (JsonElement anArr : arr) {
list.add(read(anArr));
}
return list;
}else if(in.isJsonObject()){
Map map = new LinkedTreeMap();
JsonObject obj = in.getAsJsonObject();
Set> entitySet = obj.entrySet();
for(Map.Entry entry: entitySet){
map.put(entry.getKey(), read(entry.getValue()));
}
return map;
}else if( in.isJsonPrimitive()){
JsonPrimitive prim = in.getAsJsonPrimitive();
if(prim.isBoolean()){
return prim.getAsBoolean();
}else if(prim.isString()){
return prim.getAsString();
}else if(prim.isNumber()){
Number num = prim.getAsNumber();
// here you can handle double int/long values
// and return any type you want
// this solution will transform 3.0 float to long values
if(Math.ceil(num.doubleValue()) == num.longValue())
return num.longValue();
else{
return num.doubleValue();
}
}
}
return null;
}
}
并像这样使用它:
GsonBuilder builder=new GsonBuilder();
List levelPattern = Arrays.asList(Arrays.asList(2131558489L, 2L, 3L),
Arrays.asList("one", "two", "three"));
String levelPatternGson = new Gson().toJson(levelPattern);
List levelPattern2 = new GsonBuilder()
.registerTypeAdapter(List.class, new ListDeserializerDoubleAsIntFix())
.create()
.fromJson(levelPatternGson, List.class);
System.out.println(levelPattern2);
Json: [[2131558489,2,3],[“one”,”two”,”three”]]
Output: [[2131558489, 2, 3], [one, two, three]]