具体而言,我将gson的ObjectTypeAdapter类复制到我的项目中,并进行了以下更改(第78行):
这
case NUMBER:
return in.nextDoulbe();
要
case NUMBER:
String s = in.nextString();
if(s.contains("."))
return Double.valueOf(s);
else
return Long.valueOf(s);
现在这个类在gson-2.8.1.jar和my.jar中定义。
根据我的测试,这可以正常工作,my.jar中的那个被选中,而且数字现在并不总是被解析为double。
问题是如何确保我的版本始终被挑选?或者不可能?
答案 0 :(得分:0)
在classpath上首先是规则。有几个类加载器已经可能会造成一些困难(如app server libraries)。但是在java 9中,你的技巧可能不再有用了。
所以请自定义TypeAdapter。
首先我尝试扩展,但由于ObjectTypeAdapter
是最终类(感谢@Leon),on可以使用委托给ObjectTypeAdapter。
public class MyObjAdapter extends TypeAdapter<Object> {
private ObjectTypeAdapter delegate = new ObjectTypeAdapter();
@Override public Object read(JsonReader in)
throws IOException {
JsonToken token = in.peek();
switch (token) {
case NUMBER:
String s = in.nextString();
return s.contains(".") || s.containsIgnoreCase("E")
? Double.valueOf(s)
: Long.valueOf(s)
default:
return delegate.read(in);
}
} ...
}
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Object.class, new MyObjAdapter());
Gson gson = builder.create();