利用ObjectMapper将javabean转为json

在java服务端实体对象和json之间进行相互转换的时候,常用到的框架有json-lib,Jackson,fastjson,gson等等。以前用gson比较多,而且gson在很多情况下的确表现不俗,不过在做一段时间的服务端之后,发现在将Hibernate实体对象和json互转的时候,继续使用gson便有些不便了,而Spring框架里面再带的Jackson则很容易做到。


使用gson将Hibernate实体对象转为json主要存在以下几方面的难点:

1、Hibernate对象里的有些字段的fetchType是采用LAZY加载的模式,这样做的好处是没有用到该属性的时候不会触发数据库查询,节约服务器资源,不过节约了服务器资源,在转换时可就是问题了。因为转换时那些LAZY字段其实并没有值,所以会出现转换错误。解决方法是要么将fetchType改为EARGLY,要么是用Expose注解,将需要转换的字段标注出来,使用new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();创建Gson对象,没有@Expose注释的属性将不会被序列化,这样就不会报错了。

2、Hibernate对象可能会存在相互关联,在序列化的时候导致循环引用,无穷无尽,最终产生StackOverFlow的错误,也就是内存溢出。使用gson具体怎么解决有几种方式,包括受用@Transient注解,@Expose注解,自定义Gson序列生成器等等,就不一一赘述了。


虽然Gson在其他方面和某些性能上面也非常出众,但是Jackson在解析Hibernate实体对象的时候有着自己独特的优势。

首先,创建一个ObjectMapper对象,这个对象是用来作属性转换的映射的;创建完ObjectMapper对象后为这个对象添加过滤器,new SimpleFilterProvider().addFilter(filterName,SimpleBeanPropertyFilter.filteAllExcept()),添加需要序列化的字段。如果序列话输出的属性键名和实体对象的属性名不一致的话,可以创建一个抽象类或者接口,将需要转换的属性名列出来,使用@JsonProperty()abstract String getXXX();注解,括号里面写需要输出的键名,getXXX是对应属性的getter方法。然后用ObjectMapper的addMixInAnnotations(traget.class,MixIn.class)方法转换输出键名。

另外,如果要在序列话输出的时候对某些属性进行特殊的处理的话,可以在实体类里面的对应属性上面加上@JsonSerializer(using = CustomSerializer.class)注解,CustomSerializer是自定义的序列器,继承自JsonSerializer<T>,用于对属性值进行处理后序列化输出。

最后,在遇到属性值为空——即不存在的时候,我们通常是输出为一个空字符串"",这时候用ObjectMapper的getSerializerProvider.setNullValueSerializer()方法,里面实现过程为:jsonGenerator.writeString("");这样就能将空值转为空字符窜输出了,当然,也可以输出成其他的值。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值