第一种方法:
项目当中我希望把一个对象方便的封装成JSON对象,当然需要导入相关Jar 包 json-lib-2.2.2-jdk15.jar 与
commons-beanutils-1.7.0.jar
下面生成Json对象,使用fromObject()方法将user对象格式化成Json格式,如下面代码:
JSONObject json = new JSONObject().fromObject(user)
当我重启运行后,出现下面的错误
net.sf.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.ares.pojo.Member.blacklists, no session or session was closed
这种错误是因为 Hibernate 对象映射后延迟加载错误,好吧,我们把lazy=flase就OK了.可惜我使用的注解的形式,所以我得把 fetch = FetchType.EAGER 换成 fetch = FetchType.LAZY 以为成功了,可是还是出错了,异常如下:net.sf.json.JSONException: There is a cycle in the hierarchy!
好吧,上面的异常出现那你就不得不看看你映射后的实体当中是不是有对象的集合,这里我将我的实体(member)对象给大家看一下,如下图:
实体当中有四个集合,如下:
private Set<Prepaidlog> prepaidlogsForOperateid = new HashSet<Prepaidlog>(0);
private Set<Shortmsg> shortmsgs = new HashSet<Shortmsg>(0);
private Set<Prepaidlog> prepaidlogsForOperatedid = new HashSet<Prepaidlog>(0);
private Set<Blacklist> blacklists = new HashSet<Blacklist>(0);
当json-lib反序列化中会进行双向转换,从而形成死循环,会报一个json-lib的经典异常:net.sf.json.JSONException: There is a cycle in the hierarchy!
也就是说主外键自身关联的是个死循环,那怎么才能不让他出现这种情况呢,应该有个配置的参数后者终止循环的地方吧,查看发
现,jsonConfig,呵呵,config应该是配置参数吧,参看JsonConfig看见巨多的属性,有点晕PropertyFilter
,不提了,看了老半天,发现了一个属性PropertyFilter,PropertyFilter 是一个interface,代码如下:
public interface PropertyFilter
{
public abstract boolean apply(Object obj, String s, Object obj1);
}
也就是说我可以通过这个方法过滤掉集合里的相应属性,只要让它返回true就可过滤掉,……,有点悬……我们重写一下这个方法:
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter()
{
public boolean apply(Object source, String name, Object value) {
if(name.equals("prepaidlogsForOperateid ")||name.equals("shortmsgs ")||name.equals("prepaidlogsForOperatedid ")||name.equals("blacklists ")) {
return true;
} else {
return false;
}
}
});
将hibernate产生的实体bean中的prepaidlogsForOperateid 和shortmsgs 和 prepaidlogsForOperatedid 还有 blacklists 过滤掉就OK了!
然后调用JSONObject jsonObject = JSONObject.fromObject(member, config);将数据转换成Json对象.
第二种方法:
第二种方法使用的是Google的Gson 当然导入相关Jar包:gson-2.1.jar
如果没有主外键自身关联的死循环那,直接可以使用
Gson gson = new Gson();
gson.toJson(member);
上面的方法就是把对象封装成Json对象.
可是我的情况就不一样了,我的操作如下:
因为采用的是注解开发,以所我在我的实体当中要显示的属性要设置为@Expose,当实体的属性设置成@Expose注释的属性将不会被序列化,如我下图:
然后如下使用就可以了
Gson gson=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
gson.toJson(member);
不足之处请大家指点与拍砖,谢谢!
相关推荐
Ajax请求接口,Django框架下从该接口接收Ajax发送的json数据,同时将新的json数据返回给Ajax,Ajax收到后在js进行处理,然后和页面内容交互。整个数据前后端交互全部采用json格式。代码高度封装,只需要更改json内容...
ajax请求时可以json时间格式的时间转化为你想在界面上显示的任意样式,js全部都封装好了,简单易用
struts2下通过jquery的ajax从后台传json对象并展示在web页面上的一个小例子,所需的jar包请自己下载否则无法运行,所需的包包括struts的必须包,json的支持包和struts对json的支持包
由于Ajax技术目前的流行使用,我客户端代码的JS的面向对象代码使用中,很多框架大量使用JSON来书写。在实际开发中,除了在服务器返回XML字符流以外,我们可以在服务器端动态的生成JSON代码,这样可以更好的封装...
JavaScript-初识ajax、ajax封装、及json简单实战案例(下)
ajax异步刷新返回json数据进行一系列操作
已对ajax进行封装,可直接进行调用,并返回数据! ajaxText(url);返回文本格式, ajaxJson(url);返回json格式
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
0.30.jar放到工程的lib下面,然后struts2在struts.xml的配置文件中可以指定返回的结果集的类型为:json,把返回的结果封装为json字符串JSON插件是Struts2的Ajax插件,通过利用JSON插件,允许开发者以非常灵活的方式...
看见ajax一个ajax封装器,能够对Json对象进行重构,预先请求对象,后置处理响应数据等。依赖相关注意仅适用于json数据响应。快速开始npm install see-ajax --saveimport seeAjax from 'see-ajax';// 配置应用seeAjax...
利用ajax技术返回普通文本,xml格式,JSON格式数据等案例;具体案例如下: 1.前端创建HTTPXMLRequest对象及实现步骤,后台用jsp的servlet处理数据; 2.封装HTTPXMLRequest对象,实现通用的ajax技术; 3.利用ajax技术...
json jar 包,java 开发Ajax ,封装json格式的jar包工具
本人刚从达内毕业,以上代码是学习中老师详细讲解的.含有很清楚的注释.ajax对象的获取以及使用,包括jQuery对ajax对象的封装都有详细的代码.供大家参考学习
selenium自定义封装支持类似httpclient 的post提交方式,并获取返回值,对于获取异步请求中返回的json对象值很有用。
封装好的Jquery 的ajax 的json的AutoComplete控件(用户控件),json序列化也做好了,拎包入住
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
JSON简介,json封装格式及在ajax及rpc中的应用
可以直接将集合的类型,直接转换为Json的格式,方便实现ajax数据的读取
下面小编就为大家带来一篇PHP封装返回Ajax字符串和JSON数组的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
ajax跨域java,前台jquery,json格式封装,中文传值问题,后台action层设置。sever层接收,传值中文解码