java gson arraylist_java – 将带有Gson的ArrayList转换为String

整数和双精度之间的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]]


版权声明:本文为weixin_35618539原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。