Gson可以将json字符串转换成map, 但是在转成map时, 原json字符串中的int , long型的数字会默认被转换成double类型 , 导致数字会多一个小数点 , 如 1 会转成 1.0。
我们可以用自定义TypeAdapter
替代Gson默认的adapter解决:
Gson gson = new GsonBuilder().registerTypeAdapter(new TypeToken<Map<String, Object>>()
{
}.getType(), new GsonTypeAdapter()).create();
HLJHttpResponse response = gson.fromJson(result, HLJHttpResponse.class);
GsonTypeAdapter代码:
public class GsonTypeAdapter extends TypeAdapter<Object>
{
@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 HashMap<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;
}
// 判断数字是否为整数值
long lngNum = (long) dbNum;
if (dbNum == lngNum)
{
return lngNum;
} 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
{
// 序列化不处理
}
}