以前在使用Json-lib的时候,总是报
There is a cycle in the hierarchy!
这个错误,所以好长时间使用json数据的时候都是在Action中自己手工装配json格式的数据,前几天,在JE上面看到这篇帖子:
http://www.iteye.com/topic/826988这篇帖子,看到这个链接
http://s.xnimg.cn/a13819/allunivlist.js,这个链接上是JSON格式的数据,貌似这些数据不少,但是,如果手工装配的话,那肯定是一个累人的活,就算是用循环(PS:俺不知道JSON-lib上面是怎么做的,以后有时间再研究研究),所以自然就想到了json-lib(PS:貌似还有GSON,Google的,据说效率老高了,但是struts2的lib中是json-lib),但是俺又不咋会用json-lib,所以只能求助于大家了,在JE上提了一个问题
http://www.iteye.com/problems/56669(再次感谢大家的帮助),所以总结一下:
这里,模仿人人网上,建立三个实体:Province,College,Department,分别是省份,大学,院系,关联关系如下:
Province-----College一对多,双向
College------Department一对多,双向
实体的主要代码如下:
public class Province {
/*省份id*/
private Integer proid;
/*省份名*/
private String proname;
private Set<College> colleges = new HashSet<College>();
}
public class College {
/*学校id*/
private Integer colid;
/*学校名称*/
private String name;
/*学校所在省*/
private Province province;
private Set<Department> depts = new HashSet<Department>();
}
public class Department {
private Integer depid;
private String depname;
private College college;
}
以我个人的理解,测试代码如下:
@Test
public void testFormat() {
Province pro = new Province();
pro.setProid(12);
pro.setProname("湖北省");
College col1 = new College();
col1.setColid(1);
col1.setName("黄冈师范");
col1.setProvince(pro);
Department dept1 = new Department();
dept1.setDepid(11);
dept1.setDepname("计科院");
Department dept2 = new Department();
dept2.setDepid(12);
dept2.setDepname("计科");
Department dept3 = new Department();
dept3.setDepid(13);
dept3.setDepname("计科");
Set<Department> depts = new HashSet<Department>();
depts.add(dept1);
depts.add(dept2);
depts.add(dept3);
col1.setDepts(depts);
College col2 = new College();
col2.setColid(2);
col2.setName("黄冈师范学院");
col2.setProvince(pro);
Department dept4 = new Department();
dept4.setDepid(21);
dept4.setDepname("计科院");
Department dept6 = new Department();
dept6.setDepid(22);
dept6.setDepname("计科");
Department dept5 = new Department();
dept5.setDepid(23);
dept5.setDepname("计科");
Set<Department> depts2 = new HashSet<Department>();
depts2.add(dept4);
depts2.add(dept5);
depts2.add(dept6);
col2.setDepts(depts2);
Set<College> cols = new HashSet<College>();
cols.add(col1);
cols.add(col2);
pro.setColleges(cols);
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter(new CustomPropertyFilter());
JSONObject json = JSONObject.fromObject(pro, config);
System.out.println(json.toString());
}
但是打印出来的数据是:
{"colleges":[{"colid":1,"depts":[{"college":null,"depid":13,"depname":"计科"},{"college":null,"depid":12,"depname":"计科"},{"college":null,"depid":11,"depname":"计科院"}],"name":"黄冈师范","province":null},{"colid":2,"depts":[{"college":null,"depid":21,"depname":"计科院"},{"college":null,"depid":22,"depname":"计科"},{"college":null,"depid":23,"depname":"计科"}],"name":"黄冈师范学院","province":null}],"proname":"湖北省","proid":12}
打印出来的json数据中有"college":null和"province":null这样的数据,所以自然不爽,看了
大虾的回答,就加上了类:
import net.sf.json.util.PropertyFilter;
/**
* 自定义属性过滤器
*
* @author qiuzj
*
*/
public class CustomPropertyFilter implements PropertyFilter {
@Override
public boolean apply(Object source, String name, Object value) {
// 过滤掉为null的属性
if (value == null)
return true;
return false;
}
}
然后在测试的代码中加上如下代码:
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter(new CustomPropertyFilter());
JSONObject json = JSONObject.fromObject(pro, config);
这样就可以去掉json数据中为null(PS:上面的测试代码中College类中的Province属性没有设置,Department类中的College属性没有设置)。
如果要设置College类中的Province属性,则会报
There is a cycle in the hierarchy!
错误,所以应该再加上:
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
这样就不会报错(但是这样加上之后,又会出现"province":null的情况,解决办法俺还不知道)
对于JSON-lib大家还有什么更好的办法,大家一起研究一下.......
分享到:
相关推荐
json-lib体积小、无依赖,性能表现也不错,适合在各种Java项目中使用。 json-lib的主要功能有: 1. 简单易用:json-lib的API简单易于使用,一般只需要一行或两行代码就可以完成Java对象和JSON的相互转换。 2. 支持对象图:...
1、json的核心包:json-lib-2.4-jdk15.jar; 2、json-lib-2.4-jdk15.jar依赖的jar包:commons-beanutils-1.9.3.jar,commons-collections-3.2.2.jar,commons-lang-2.6.jar,commons-logging-1.2.jar,ezmorph-1.0.6...
JSON-lib包json-lib-0.8.jar和json-lib-0.9.jar包
里面包含json-lib所需的全部jar文件. json-lib-2.1-jdk15.jar ezmorph-1.0.3.jar commons-beanutils.jar commons-collections-3.2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar
json基础jar包,包含json-lib-2.3-jdk15.jar源码
json架包,包好json-lib-2.2.3-jdk13.jar,json-lib-2.4-jdk14.jar以及附带的支持包ezmorph-1.0.6.jar,commons-logging.jar,commons-lang.jar等
<groupId>net.sf.json-lib</groupId> <artifactId>json-lib <version>2.4 <classifier>jdk15 或者直接下载这个包
json-lib-2.4-jdk15所需全部JAR包,资源清单 json-lib-2.4-jdk15.jar 依赖: ezmorph-1.0.6.jar commons-beanutils-1.8.3.jar commons-lang-2.5.jar morph-1.1.1.jar commons-logging-1.1.1.jar commons-collections-...
json-lib-2.4-jdk15.jar json-lib-2.4-jdk15-sources.jar json-lib-2.4-jdk15-javadoc.jar 包含文件有:json-lib-2.4-jdk15.jar json-lib-2.4-jdk15-sources.jar json-lib-2.4-jdk15-javadoc.jar
json-lib-2.2.3-jdk15-javadoc.jar json 源代码
使用json-lib实现json与Java对象的互转
json-lib-2.4-jdk15依赖的库文件: 压缩包内容: commons-beanutils-1.8.0.jar commons-collections-3.1.jar commons-lang-2.5.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar json-lib-2.4-jdk15-javadoc.jar ...
jquery和struts2结合使用的jar包
json的核心包:json-lib-2.4-jdk15.jar;json-2.4所依赖的jar包:commons-beanutils-1.8.0.jar,commons-collections-3.2.1.jar,commons-lang-2.5.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar;以及和...
json-lib-2.2.3-jdk13.jar commons-beanutils-1.7.0.jar commons-collections-3.2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar
json-lib-2.4-jdk15-sources.jar 是net.sf.json-lib-jdk15-2.4的源码文件
json-lib 提供了强大的JSON支持,利用Ajax提交上来的JSON字符串进行解析,可以转化为POJO对象,可以从POJO转化为js可以识别的JSON对象。方便易用!
json-lib-2.4-jdk15.jar所需全部JAR包需要的伙伴们下载
由于maven 网站仓库不能下载json-lib,去官网还需要一个一个下jar,所以将下载下来的jar打包分享下!