我遇到了一个问题,我无法对json字符串的整数进行反序列化。相反,我得到的只是浮点数(或双倍数?),当数字为12
时,它应该是一个int,而当12.0
时,它应该是浮点数(或双精度数)? Gson没有做到这一点。这是我用Google搜索和获取的内容,但事情仍然相同:
public class TestRedis {
private static class MyObjectDeserializer implements JsonDeserializer<Object> {
public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Number num = null;
try {
num = NumberFormat.getInstance().parse(json.getAsJsonPrimitive().getAsString());
} catch (Exception e) {
//ignore
}
if (num == null) {
return context.deserialize(json, typeOfT);
} else {
return num;
}
}
}
public static void main(String[] argvs){
Map<String, Object> m = new HashMap<>();
m.put("a",1);
m.put("b",2);
//serilize to json string
Gson gson = new Gson();
String s = gson.toJson(m);
System.out.println(s);
//deserilize now...
GsonBuilder builder = new GsonBuilder();
Gson gson1 = builder.create();
builder.registerTypeAdapter(Object.class, new MyObjectDeserializer());
Type type = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> mm = gson1.fromJson(s,type);
System.out.println(mm);
}
}
以上是上述程序的输出:
{"b":2,"a":1}
{b=2.0, a=1.0}
显然gson make将整数误认为是double或float
对于那些可能建议制作结构表示相应值的真实类型的人,我不能,因为我处理的真实类型是Map<String, Object>
此地图的值可以是任何类型。