Gson 反序列化Map类型的小问题

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;


/**
 * 
 * @author Dabria_ly
 * 2017年7月13日
 */
public class Test3 {
public static void main(String[] args) throws ParseException {
  Gson gson = new Gson();
Map<String, String> map = new HashMap<String, String>();
map.put("id","12879613");
map.put("name","张三");


Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("id",12879618);
map2.put("num",128);
map2.put("name","李四");

Map<String, Object> map3 = new HashMap<String, Object>();
System.out.println("id序列化后的结果="+gson.toJson("12879619"));
System.out.println("num序列化后的结果="+gson.toJson(12879777));
map3.put("id", gson.toJson("12879619"));
map3.put("name", gson.toJson("王五"));
map3.put("num", gson.toJson(12879777));
map3.put("count", String.valueOf("12879777"));


String mapToStr = JSONObject.toJSONString(map);
Map<String, String> newMap = gson.fromJson(mapToStr, new TypeToken< Map<String, String>  >() {}.getType());

String map2ToStr = JSONObject.toJSONString(map2);
Map<String, Object> newMap2 = gson.fromJson(map2ToStr,new TypeToken< Map<String, Object>  >() {}.getType());


String map3ToStr = JSONObject.toJSONString(map3);
Map<String, Object> newMap3 = gson.fromJson(map3ToStr,new TypeToken< Map<String, Object>  >() {}.getType());

System.out.println("newMap="+newMap);
System.out.println("newMap2="+newMap2);
System.out.println("newMap3="+newMap3);

}

}

------------------------执行结果:-------------------------------

id序列化后的结果="12879619"
num序列化后的结果=12879777
newMap={name=张三, id=12879613}
newMap2={num=128.0, name=李四, id=1.2879618E7}
newMap3={num=12879777, name="王五", count=12879777, id="12879619"}

------------------------------------完毕----------------------------------------------------------

从上面的执行结果可以看出,Gson在反序列Map<String, Object>数据类型时,它没有正确的反序列我想要的数据。当然想要让它变成我想要的数据方法有很多:

1.像map3 一样先调用gson序列化一下,然后再反序列(个人觉得这种方法有点小鸡肋,然而也觉得这个是目前是最好的方法);

2.像map一样,将数据类型声明成Map<String, String>类型(我特别不喜欢将数据类型定义成这样,别问我为啥,个人习惯咯);

3.定义一个javaBean,将我们的数据转换成JavaBean对象(亲测,可以解决我目前的情况,但是对于一次性数据,我内心是很拒绝去定义一个javaBean对象的,别问我为啥,个人习惯咯).

目前是实际项目中遇到这种问题,所以采用了上述之一的方法来解决。虽然问题是解决的,但我还是有点小纠结为啥Gson反序列化Map<String, Object>失败,于是就只能去查看源码了,最后在debug源码时发现,源码执行 T object = typeAdapter.read(reader);到这一句时,将我们的数据改变的,查看Gson文档,应该是我们用的TypeAdapter是Gson自带的,它里没没有定义,点源码进去看,实在太多,不想看下去了。有不有大神,求赐教,写一个能反序列化Map<String, Object>数据类型的demo

展开阅读全文

没有更多推荐了,返回首页