- 浏览: 157113 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
semmy:
赞一个
displaytag的Excel导出实践 -
李君寻:
...
displaytag的Excel导出实践 -
xiaoz170:
不太明白为嘛包这一层 class ,反而使代码更复杂。难道是为 ...
试读《基于MVC的JavaScript Web富应用开发》— 不一样的JavaScript -
lingceng:
<mirror> <id>U ...
maven usage guide
背景
应用切面做日志记录,记录操作实体详情时可以使用JSON格式,这里是我使用Gson包做切面日志的一些实践,总结了遇到的问题。
软件包和学习方法
这里使用google的Gson包做JSON转换,这里是项目的地址,可以查看上面的API和User Guide。务必将源码和API配置好,文档中的记录不是很完善,很多时候需要查看源码。
注意,我使用的是2.2版,因为较早的1.4版本的FieldAttributes类中没有getDeclaringClass()这个方法,这个方法是获取field所属的类,在我的排除策略中会用到。
排除策略
最简单的gson转换可以是这样的,但却没有多少实际的作用。切面日志时,一个实体和其他实体存在关联,这时候就需要通过自定义排除策略决定如何转换关联对象,否则可能出现“爆炸式”的json字符串。
下面是我定义的一个排除策略的类,能基本满足需求,从内网搬过来的,未测试
使用的时候是这样的
HibernateProxy异常处理
在使用Hibernate时,那么很可能遇到这样的错误:
java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
因为gson在转换时是使用的反射机制,当获取的实体对象还在hibernate代理的时候,例如刚通过Id获取到,这时候获取到的便是代理对象HibernateProxy。这和直接调用实体对象的get方法不同,获取对象的属性就不能起作用。
解决的方法便是将代理对象实例化,见下面的代码
使用的时候将该TypeAdapter的Factory注册到GsonBuilder,上面的代码变为
Javascript格式化
默认情况下,在页面上显示json字符串时是连在一起的,格式化一下可以便于阅读:
这里要注意的是IE8在转换的时候会出现问题,所以需要引入json.js,将里面的JSON换为JSON2来使用,这时候代码便是这样的
应用切面做日志记录,记录操作实体详情时可以使用JSON格式,这里是我使用Gson包做切面日志的一些实践,总结了遇到的问题。
软件包和学习方法
这里使用google的Gson包做JSON转换,这里是项目的地址,可以查看上面的API和User Guide。务必将源码和API配置好,文档中的记录不是很完善,很多时候需要查看源码。
注意,我使用的是2.2版,因为较早的1.4版本的FieldAttributes类中没有getDeclaringClass()这个方法,这个方法是获取field所属的类,在我的排除策略中会用到。
排除策略
最简单的gson转换可以是这样的,但却没有多少实际的作用。切面日志时,一个实体和其他实体存在关联,这时候就需要通过自定义排除策略决定如何转换关联对象,否则可能出现“爆炸式”的json字符串。
Gson gson = new Gson(); int[] ints = {1, 2, 3, 4, 5}; String[] strings = {"abc", "def", "ghi"}; // Serialization gson.toJson(ints); ==> prints [1,2,3,4,5] gson.toJson(strings); ==> prints ["abc", "def", "ghi"]
下面是我定义的一个排除策略的类,能基本满足需求,从内网搬过来的,未测试
package com.lingceng.magic.logutil; import org.apache.commons.lang.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; public class TargetStrategy implements ExclusionStrategy { private static Logger log = LoggerFactory.getLogger(TargetStrategy.class); private Class<?> target; private String[] fields; private Class<?>[] clazz; private boolean reverse; public TargetStrategy(Class<?> target) { super(); this.target = target; } @Override public boolean shouldSkipClass(Class<?> class1) { return false; } @Override public boolean shouldSkipField(FieldAttributes fieldattributes) { Class<?> owner = fieldattributes.getDeclaringClass(); Class<?> c = fieldattributes.getDeclaredClass(); String f = fieldattributes.getName(); boolean isSkip = false; if (owner == target) { if (ArrayUtils.contains(fields, f)) { log.debug("fitler field:{} for class:{}", f, owner); isSkip = true; } if (ArrayUtils.contains(clazz, c)) { log.debug("fitler class:{} for class:{}", c, owner); isSkip = true; } if (reverse) { isSkip = !isSkip; } } return isSkip; } public void setFields(String[] fields) { this.fields = fields; } public void setClazz(Class<?>[] clazz) { this.clazz = clazz; } public void setReverse(boolean reverse) { this.reverse = reverse; } }
使用的时候是这样的
TargetStrategy ts = new TargetStrategy(Student.class); //这里是仅转换Student中的id和name属性 ts.setFields(new String[] {"id", "name"}); ts.setReverse(true); Gson gson = new GsonBuilder().setExcludeStrategy(ts).create(); gson.toJson(teacher);
HibernateProxy异常处理
在使用Hibernate时,那么很可能遇到这样的错误:
java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
因为gson在转换时是使用的反射机制,当获取的实体对象还在hibernate代理的时候,例如刚通过Id获取到,这时候获取到的便是代理对象HibernateProxy。这和直接调用实体对象的get方法不同,获取对象的属性就不能起作用。
解决的方法便是将代理对象实例化,见下面的代码
/** * This TypeAdapter unproxies Hibernate proxied objects, and serializes them * through the registered (or default) TypeAdapter of the base class. */ public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> { public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { @Override @SuppressWarnings("unchecked") public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson) : null); } }; private final Gson context; private HibernateProxyTypeAdapter(Gson context) { this.context = context; } @Override public HibernateProxy read(JsonReader in) throws IOException { throw new UnsupportedOperationException("Not supported"); } @SuppressWarnings({"rawtypes", "unchecked"}) @Override public void write(JsonWriter out, HibernateProxy value) throws IOException { if (value == null) { out.nullValue(); return; } // Retrieve the original (not proxy) class Class<?> baseType = Hibernate.getClass(value); // Get the TypeAdapter of the original class, to delegate the serialization TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType)); // Get a filled instance of the original class Object unproxiedValue = ((HibernateProxy) value).getHibernateLazyInitializer() .getImplementation(); // Serialize the value delegate.write(out, unproxiedValue); } }
使用的时候将该TypeAdapter的Factory注册到GsonBuilder,上面的代码变为
Gson gson = new GsonBuilder().setExcludeStrategy(ts) .registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY) .create(); gson.toJson(teacher);
Javascript格式化
默认情况下,在页面上显示json字符串时是连在一起的,格式化一下可以便于阅读:
// get text for textarea, do not use text() var msg= $("#jsonText").val(); // parse json msg = JSON.parse(msg); // return format string msg = JSON.stringify(msg, null, 4);
这里要注意的是IE8在转换的时候会出现问题,所以需要引入json.js,将里面的JSON换为JSON2来使用,这时候代码便是这样的
// get text for textarea, do not use text() var msg= $("#jsonText").val(); // parse json msg = JSON2.parse(msg); // return format string msg = JSON2.stringify(msg, null, 4);
发表评论
-
Hack struts2 json plugin: dynamically set includeProperty
2013-07-26 11:27 1241Here is not basic use of stru ... -
CoffeeScript notes: write less do more
2013-07-26 10:36 1015The Little Book on CoffeeScript ... -
JS中Date与字符串的转换
2013-07-22 10:23 3175string to date /** * parse ... -
简单使用highstock
2013-07-22 10:16 8697引用 Highstock lets you create ... -
jquery.column.picker
2013-07-09 11:20 866jquery.column.picker是基于jquery的表 ... -
使用jslint与qunit保障JS代码质量
2013-07-09 11:16 949使用jslint进行语法和风格的检查,可以预防错误。 ... -
Calender to Date snip
2013-05-30 10:25 898The format is not stored in the ... -
jQuery几个实用的方法
2013-05-18 15:49 710有段时间没有碰jQuery,回来继续用的时候,发现几个方法很有 ... -
Vim find & replace
2013-04-10 17:59 1142Vim find & replace (RT) To ... -
displaytag的Excel导出实践
2013-03-01 18:00 6059前言 Displaytag官网有1.0, 1.1, 1.2 ... -
Disable Element In HTML
2013-02-25 11:43 1255disabled attribute This Boole ... -
hibernate criteria can't cast to type
2013-01-23 11:54 1045描述 criteria动态查询中,先使用setProje ... -
requirejs处理前端JS依赖
2013-01-23 11:39 8169简介: Requrejs遵循AMD ... -
vim fast move tip
2013-01-23 11:03 837search: * to search current ... -
读《深入分析Java Web技术内幕》
2013-01-16 21:37 3297这里这本书的预读章节,看完预读部分,解答了一些疑惑 ... -
Vim good Tip
2013-01-07 00:35 0Most time is spent reading, ... -
Prevent IE crash console.log
2012-12-05 15:24 921origin When the console is cl ... -
Javascript对象封装的三种简单写法
2012-11-11 18:43 934这里的内容没有太多深入的东西,更深的理解请看秘 密花 ... -
Java泛型
2012-11-08 23:57 1580Java的泛型是5.0的特性,自己的业务代码中或许较少使用 ... -
lucene全文索引
2012-11-08 01:45 1459总听说lucene,总听到“全文检索”,一直不大明白什么意 ...
相关推荐
赠送jar包:gson-2.8.0.jar; 赠送原API文档:gson-2.8.0-javadoc.jar; 赠送源代码:gson-2.8.0-sources.jar; 赠送Maven依赖信息文件:gson-2.8.0.pom; 包含翻译后的API文档:gson-2.8.0-javadoc-API文档-中文...
介绍:Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. 压缩包里有以下文件: ...
om.google.code.gson/gson/2.6.2 Gson maven依赖 java 开发包
gson jar包 gson jar包下载 gson jar包下载 gson jar包下载
com.google.gson.Gson 2.8.1 2.8.2 jar包 gson,直接解压到maven仓库,或者提取里面的jar包都可以使用
json我们在网络请求中经常用到,最近最火的微信小程序开发中... 就会报错,因为对于嵌套类型的json它是解释不出来的,这时就需要用到com.google.gson.Gson.jar了。资源中提供了jar包与代码示例,一句代码解决您的问题。
GSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。 Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个JSON字符串...
Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象。 Gson里最重要的对象有2个Gson 和 GsonBuilder Gson有2个最基本的方法 1) toJson() – 转换java 对象到JSON 2) from...
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class ...
赠送jar包:gson-2.8.7.jar; 赠送原API文档:gson-2.8.7-javadoc.jar; 赠送源代码:gson-2.8.7-sources.jar; 赠送Maven依赖信息文件:gson-2.8.7.pom; 包含翻译后的API文档:gson-2.8.7-javadoc-API文档-中文...
截止至2018-11-27,github上com.google.gson.Gson 最新的2.8.5jar包。强大的json字符串解析功能及将字符串转换为json格式。我16年上传的免费下载的2.8.0版本不知道为什么变成下载需要50分了
java解析json所需的三个jar包。包含org.json、Gson、fastjson三个jar包
截止至2016-12-23,github上com.google.gson.Gson 最新的2.8.0jar包。强大的json字符串解析功能及将字符串转换为json格式。才发现需要这么多分,大家也可以去网盘下载: ...
GSON完整包,包含三个jar包。 gson-2.2.4.jar GSON生成解析json数据的基本jar包; gson-2.2.4-javadoc.jar GSON API介绍文档包; gson-2.2.4-sources.jar GSON源码包。 下载一个玩玩吧!
Gson实战
赠送jar包:gson-2.8.9.jar; 赠送原API文档:gson-2.8.9-javadoc.jar; 赠送源代码:gson-2.8.9-sources.jar; 赠送Maven依赖信息文件:gson-2.8.9.pom; 包含翻译后的API文档:gson-2.8.9-javadoc-API文档-中文...
网络上有很多Json解析库,这里我使用Gson来解析Json,Gson有个特点,就是要将数据的键作为变量封装到一个个实体中,如果值为数组的,变量的类型还必须是集合,然后通过Gson.fromJson来传入数据和实体类,再通过实体...
gsondemo json 解析类
string->object,list->string,string->list,object->string
Gson-2.8.1的官方jar包合集【gson-2.8.1.jar,gson-2.8.1-sources.jar】, 包含Gson核心包和源码包。