毕设问题(2) fastjson 的过滤器使用(SSH hibernate)以及转换对象出现 $ref

  毕业设计,用SSH框架,但是想要做出异步请求数据的效果,使用了ajax方式,其中数据传递的类型为json。ajax使用用的jQuery的ajax。其实struts里也支持ajax功能,但是我觉得用太多struts的自带标签,想使用bootstrap的定义风格就不好了,页面效果会打折扣,另外个人觉得现在的更广泛的是前端的写前端的,尽量不要前台的也需要知道struts如何写,之后重构也更麻烦。[补充,搜索过一个有个插包使在struts可以用bootstrap,但是觉得可能支持的bootstrap的版本会低于当前]

  言归正传,使用json的话需要使用工具,有java自带的JSONArray、JSONObject,但是使用的时候回提示存在类无法初始化,即指用到的类并不存在,需要引入其他的jar包,后来网上去查了下,导入了一些包,但是还是有问题,可能是没有完全。觉得麻烦就放弃了用这个。于是找了fastjson,自称是最快的,转换速度比gson(google)的快6倍。目前的项目你只有到github上去下载最新的,网上的很多以前的文章给出的链接已经失效。github地址:https://github.com/alibaba/fastjson   说明一句文档实在太过简略。

  官方的常见问题:https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

常用的方法是:

public static final String toJSONString(Object object);
public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
其实参考官方的说明,更加清楚,有中文解释,这里说一下,官方没有提到的问题。1.过滤器的使用  问题:  对hibernate反向工程生成的类,若有引用其他的表的主键做外键,就会产生一个那张表的反向工程的类,这样我们对通过查询得到的记录,我是用Criteria方式查询,返回一个list对象。我们知道,hibernate查询若是采用lazy延迟方式加载(eager方式循环引用,好像容易出问题),在session关闭,再想获取未加载的数据时,会出现异常no session。不幸的是,直接使用fastjson转化对象成为json的时候就会查询未加载的对象,从而产生异常。  解决办法:  举个例子我们有一个专业培养计划表,里面又一个属性叫专业id,hibernate会生成一个专业类和专业培养计划类,培养计划类中有个成员对象是专业类对象,事实上我们并不需要专业类的其他属性,知道专业id即可,这是我们可以使用过滤器,使自己只对专业id进行序列化。这样就不会引起hibernate异常。  过滤的方式,我喜欢的方式有两种,一种是配置简单过滤器,另一种是注解方式声明不序列某属性。各有优缺点,建议结合使用。    a.配置简单过滤器   
List<Professioncultivationplan> list = professioncultivationplanDao
                    .query(professioncultivationplan);
// JSON过滤
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(
            Profession.class, "id");
 //fastjosn的自带简单过滤器,允许配置只序列化那个属性,这里是序列化id,这样对于在Professioncultivationplan里的profession的其他属性就不会去序列化生成json字符串

result = JSON.toJSONString(list, filter,SerializerFeature.DisableCircularReferenceDetect);//注意SerializerFeature.DisableCircularReferenceDetect是标题的第二问题的解决方案

  b. 注解

    private Integer id;
    @JSONField(serialize = false)
    private Profession profession;
    private String groupcourseCode;
    private String groupcourseCategory;
    private Float credit;
    @JSONField(serialize = false)
    private Set<Coursecultivationplan> coursecultivationplans = new HashSet<Coursecultivationplan>(
            0);
//这里我对private Profession profession;private Set<Coursecultivationplan> coursecultivationplans...使用了不进行序列haunted的声明,使用注解可以不用反复使用过滤,但是明显我们也无法使用profession里的id了,若是这个id没有什么用使用注解方式是可以的,否则应该使用第一种方式,其中第一种方式只是简单的配置过滤器,还有实现一个接口,自己写一个过滤器,更加丰富是定制过滤方式,一般而言简单过滤器就可以解决了

2.转换hibernate对象出现 $ref

  使用fastjson,当进行toJSONString的时候,默认如果重用对象的话,会使用引用的方式进行引用对象。也就是指,hibernate为我们的profession对象是在java里是同一个的话,序列化就会得到一个引用。还有一种叫循环引用——我们需要序列化的对象中存在循环引用,在许多的json库中,这会导致stackoverflow——的情况也会出现 $ref 。  在我的毕业设计里面并没有出现循环引用(A包含B,B有包含A),但是我获取一个专业培养计划表的时候,若是有多条结果,从第二条开始就会出现profession的序列化并不是第一个的记录的一样,而是引用第一个结果,所以传递到前端页面循环显示记录的时候,从第二条开始,专业id那一列变成了undefined,或许有其他的读取这个一列的方式,但是我想生成同样的结果,会比较方便和一致性,所以需要设置增加参数SerializerFeature.DisableCircularReferenceDetect,禁止以引用方式引用对象。一下是未设置的转换出来的json结果:
[{"corediscipline":"计算机科学与技术change","dlsjCompulsoryratio":0,"dlsjCredit":35,"dlsjElectiveratio":0,"dlsjPeriod":0,"id":1,"profession":{"id":5},"tsjyCompulsoryratio":30.9,"tsjyCredit":69.5,"tsjyElectiveratio":10.8,"tsjyPeriod":1042,"zyjcCompulsoryratio":32.4,"zyjcCredit":63,"zyjcElectiveratio":5.4,"zyjcPeriod":945,"zykCompulsoryratio":9.6,"zykCredit":36,"zykElectiveratio":10.8,"zykPeriod":510},
{"corediscipline":"计算机科学与技术save","dlsjCompulsoryratio":0,"dlsjCredit":35,"dlsjElectiveratio":0,"dlsjPeriod":0,"id":8,"profession":{"$ref":"$[0].profession"},"tsjyCompulsoryratio":30.9,"tsjyCredit":69.5,"tsjyElectiveratio":10.8,"tsjyPeriod":1042,"zyjcCompulsoryratio":32.4,"zyjcCredit":63,"zyjcElectiveratio":5.4,"zyjcPeriod":945,"zykCompulsoryratio":9.6,"zykCredit":36,"zykElectiveratio":10.8,"zykPeriod":510}]
				
时间: 2024-10-02 06:01:54

毕设问题(2) fastjson 的过滤器使用(SSH hibernate)以及转换对象出现 $ref的相关文章

linux ssh key的转换

我们在使用linux主机的时候一般生产key有两种形式,一种是在linux主机上面生成,然后将私钥分发出去,还有一种是用ssh工具生成然后将公钥上传至服务器.下面三种情况需要key的转换. 原创博文来自:www.51niux.com  博主:忙碌的柴少 1.第一种,用putty生成了.ppk格式的私钥,但是我们是CRT或者X-shell等ssh工具,现在就需要进行私钥的转换了.比如说我现在putty生成的的私钥名称为test.ppk,那么如何转换成id_rsa格式呢,操作如下: 首先第一步下载安

FastJson学习:JSON格式字符串、JSON对象及JavaBean之间的相互转换

当前台需要传送一系列相似数据到后端时,可以考虑将其组装成json数组对象,然后转化为json形式的字符串传输到后台 例如: nodes = $('#PmPbsSelect_tree').tree('getChecked'); var data=[]; for(var i=0;i<nodes.length;i++){ if(!isParentCheck(nodes[i],nodes)){ data.push({"id":nodes[i].id, "pid":no

JavaEE学习笔记之SSH—Hibernate(4)

今天来讲讲 Hibernate 的灵魂所在--> Session 缓存 session缓存是由一系列的Java集合构成的.当一个对象被加入到Session缓存中,这个对象的引用就加入到了java的集合中,以后即使应用程序中的引用变量不再引用该对象,只要Session缓存不被清空,这个对象一直处于生命周期中. Session缓存的作用: 1)减少访问数据库的频率. 2)保证缓存中的对象与数据库中的相关记录保持同步. Session清理缓存的时机: 1)当调用Transaction的commit()

JavaEE学习笔记之SSH—Hibernate(2)

对象关系映射 ORM 解决的主要问题就是对象-关系的映射,域模型和关系模型都分别建立在概念模型的基础上,域模型是面向对象的,关系模型是面向关系的,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录. (可能存在类中多个属性对应一列的情况,映射组成关系) ORM中间件采用元数据来描述对象-关系映射细节,元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中,如果希望把ORM软件集成到自己的java应用中,用户首先要配置对象-关系映射文件(**.hbm.xml). sess

FastJson之JsonObject, JsonString, JavaBean,List快速转换

// 将json字符串转换为json对象 JSONObject jsonObject = JSON.parseObject(jsonStr); // {"retState":"SUCCESS","retCode":"000000","retMsg":"成功", "data":[{"id":2150,"name":"合肥

fastjson的值过滤器ValueFilter

https://blog.csdn.net/linyifan_/article/details/83060408 原创林天乐 发布于2018-10-15 16:20:25 阅读数 1462  收藏 展开 项目中需要将前端传进的json数据清空值前后空格 两种实现方法 1.土方法 迭代trim() RequestContext context = RequestContext.getCurrentContext();   InputStream in = (InputStream) context

FastJSON使用笔记

虽然使用FastJSON来生成JSON数据非常简单,但是我在实际使用过程中还是发现了一些值得注意的地方,比如说:之前写过的JQuery解析FastJSON生成的JSON数据会出现的错误 今天我要记录一下一些其他的注意点 将对象转化为json字符串时,如何过滤掉部分字段? 方法一: 在JavaBean对象对应字段前加注解,这样生成的json也不包含该字段 @JSONField(serialize=false) private String userName; 方法二: 在需要生成JSON的时候使用

SSH框架整合过程总结

---------------------siwuxie095 SSH 框架整合过程总结 (一)导入相关 jar 包(共 41 个) 1.导入 Spring 的核心 jar 包和日志相关的 jar 包(6 个) Commons Logging 下载链接: http://commons.apache.org/proper/commons-logging/download_logging.cgi LOG4J 下载链接: https://www.apache.org/dist/logging/log4

基于SSH的高校网上选课系统的质量属性的实现

我对于基于SSH的高校网上选课系统的质量属性的实现是从可用性.性能.安全性.可维护性.易用性五个方面进行的实现. 可用性方面: 实现方式:(1)当系统试图超出限制范围来进行课程查询或选课时必须进行错误检测并且抛出异常,中止进一步的错误操作,所采用的战术为错误(异常)检测, 此异常属于Action层,只捕获自定义应用异常,其他异常上抛.Struts2提供了异常拦截器,拦截器会将定义的异常捕获,记录日志,然后根据配置的异常的类型顺序跳转到相应的页面.(2)遵从J2EE的系统提供了可以使用的事务服务,