`
edwardpro
  • 浏览: 300403 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

gson使用感受

阅读更多

google的东西向来以简洁唯美gson也是如此:

 

private static Gson gson = new GsonBuilder().setDateFormat(
			"yyyy-MM-dd HH:mm:ss").disableHtmlEscaping().create();
 

接下来:

 

return gson.toJson(src);
return gson.fromJson(json, clazz);

 分别是变成json或者来自json,是不是相当简单?

 

不过在使用当中也发现一些问题,当然也许是我不会用,就是fromjson有些问题,主要来自于:

 

new TypeToken<List<Long>>

 

在fromJson时需要指定类型,如果不指定类型,对于复杂对象转换不指定类型就会报错的,实际上按照我的理解,完全可以理解gson为String和String和Collection(String)转换(注意json中其实还是有数字类型的,这里只是方便期间我觉得这么搞),但是很可惜gson是不会自动调用对象的toString的,也因此必须要指定类型,但这样对bean就会有一个重大限制,比如你的bean中所有对象的类型是要统一的,比如:

 

type = new TypeToken<Map<String, String>>() {
			}.getType();

 这里构造了一个一个json到string,string的map对象,然后再通过beanutil得到bean

type = new TypeToken<List<Map<String, String>>>() {
			}.getType();
			List<T> ret = new ArrayList<T>();
			List<Map<String, String>> tempObj = gson.fromJson(json, type);
			for (Map<String, String> item : tempObj) {
				try {
					T obj = clazz.newInstance();
					for (String key : item.keySet()) {
						String value = item.get(key);
						BeanUtils.setProperty(obj, key, value);
					}
					ret.add(obj);
				} catch (InstantiationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
 这个方法看起来有点sb但是似乎试了半天也只能如此,不知道是不是我文档没有详尽的原因,这个留在以后再找答案了.
分享到:
评论
4 楼 u010503822 2017-02-28  
不懂这个是否是你需要的
// map转Json数据  json转换map
private static void mapToJson() {
Map<String, String> map = new HashMap<String, String>();
map.put("id", "1");
map.put("name", "zhangsan");

Gson gson = new Gson();
String json = gson.toJson(map);
System.out.println(json);

HashMap<String, String> m = gson.fromJson(json, new TypeToken<HashMap<String, String>>(){}.getType());
Set<Entry<String,String>> entrySet = m.entrySet();
for (Entry<String, String> entry : entrySet) {
String k = entry.getKey();
String v = entry.getValue();
System.out.println(k+"===="+v);
}


}
3 楼 quaff 2009-06-24  
对field序列化而不是对getter序列化,这是个限制
2 楼 QMax 2009-06-24  
我们在项目中也试着用了一下,发现有个问题,如果是一个很长的String(大概1M多),在toJson的时候,因为要替换字符,会非常费资源,CPU基本就是100%,处理时间也很长。试了几个其他的Json第三方包,也都有类似的问题。
不知道有没有人有什么好办法。

1 楼 mikeandmore 2009-06-13  
和python的simplejson一样啊

相关推荐

Global site tag (gtag.js) - Google Analytics