请您先登录,才能继续操作
浏览 6666 次
锁定老帖子 主题:gson使用感受
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-13
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但是似乎试了半天也只能如此,不知道是不是我文档没有详尽的原因,这个留在以后再找答案了. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-13
和python的simplejson一样啊
|
|
返回顶楼 | |
发表时间:2009-06-24
我们在项目中也试着用了一下,发现有个问题,如果是一个很长的String(大概1M多),在toJson的时候,因为要替换字符,会非常费资源,CPU基本就是100%,处理时间也很长。试了几个其他的Json第三方包,也都有类似的问题。
不知道有没有人有什么好办法。 |
|
返回顶楼 | |
发表时间:2009-06-24
对field序列化而不是对getter序列化,这是个限制
|
|
返回顶楼 | |