关于Gson返序列化Map<String,Object>,其中Object不能强转的问题。

颖辉小居 发布于 2017/11/23 09:23
阅读 5K+
收藏 0

鸿蒙原生应用开发者激励计划发布!最高获百万现金!点击立即参与

package test;

import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class GsonWhithOBJ {
	public static void main(String[] args) {

		Map<String, Object> map = new HashMap<>();
		map.put("code", 1);
		map.put("msg", "aaaaaaaaaaaaa");
		U u = new U("name", "123", 12);

		map.put("u", u);

		String json = new Gson().toJson(map);
		System.out.println("1 "+json);

		Map<String, Object> fromJsonMap = new Gson().fromJson(json, new TypeToken<Map<String, Object>>() {
		}.getType());

		System.out.println("2 "+fromJsonMap);
		Object of=fromJsonMap.get("u");
		System.out.println("3 "+of);
		U uf=(U)of;
		System.out.println("4 "+uf);
	}

}

class U {
	private String name;
	private String pwd;
	private Integer age;

	public U() {
		super();
	}

	public U(String name, String pwd, Integer age) {
		super();
		this.name = name;
		this.pwd = pwd;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

}

打印结果;

错误文本:

1 {"u":{"name":"name","pwd":"123","age":12},"code":1,"msg":"aaaaaaaaaaaaa"}
2 {u={name=name, pwd=123, age=12.0}, code=1.0, msg=aaaaaaaaaaaaa}
3 {name=name, pwd=123, age=12.0}
Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to test.U
	at test.GsonWhithOBJ.main(GsonWhithOBJ.java:28)

springMVC 返回一个json 是Map<String,Object>序列化的,客户端拿到这个json以后返序列化,需要得到put的,一个自定义对象,如何得到这个自定义对象呢? 因为这个map中必须带着 msg信息和 code 返回码(和其他的json接口返回的结构都要保持一致),所以只能使用泛型Map<String,Object>

加载中
0
窗外有个蓝蓝天
窗外有个蓝蓝天

序列化之后,之前的对象信息肯定已经丢失了,反序列化过来的是LinkedtreeMap,所以强转肯定会失败

你直接定义一个泛型对象就行了,如图

窗外有个蓝蓝天
窗外有个蓝蓝天
回复 @颖辉小居 : 封装也行,或者定义多个泛型也行,要是你还是觉得麻烦,那就还用map然后用BeanUtil去作copy到对应的实体类上也行
颖辉小居
颖辉小居
你好 比如我要 map.put("user",User) map.put("groups",List<group>) map.put("page",Page) 这样多种类型的数据,怎么用一个result返回,是不是必须把这几种类型的数据封装到一个新的类型A中再 指定Reslt<A> r=new Reslt<A>();
窗外有个蓝蓝天
窗外有个蓝蓝天
回复 @颖辉小居 : lombok注解,避免写getter setter方法的
窗外有个蓝蓝天
窗外有个蓝蓝天
回复 @颖辉小居 : 怎么可能不通用,这个泛型什么对象都能放进去的,我现在的项目也是用这种泛型对象去统一封装json结果的
颖辉小居
颖辉小居
还有这个无法通用,我可能data不是一种,如果是map可以put进去多种数据,如果用这个result 就需要把多种类型的data封装到一个类里才可以吧
下一页
0
湖水没了
湖水没了

gson fastjson这些都是有自己的json对象的,你需要自己转成java对象

推荐用jackson直接得到的就是java标准对象 不用在自己做什么转换

0
huahua139
huahua139
public static <T> Map<String, T> toMap(String jsonStr, Class<T> clazz) {
    if (StringUtils.isBlank(jsonStr)) {
        return null;
    }
    Map<String, T> stringTMap = gson.fromJson(jsonStr, new MapParameterizedType(clazz));
    return stringTMap;
}

 

static class MapParameterizedType<T> implements ParameterizedType {

    private Class<T> clazz;

    protected MapParameterizedType(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public Type[] getActualTypeArguments() {
        return new Type[]{String.class, clazz};
    }

    @Override
    public Type getRawType() {
        return Map.class;
    }

    @Override
    public Type getOwnerType() {
        return null;
    }
}
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部