`
guimingyue
  • 浏览: 76294 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

Json-lib的使用小结

    博客分类:
  • Java
阅读更多
以前在使用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大家还有什么更好的办法,大家一起研究一下.......
分享到:
评论

相关推荐

    Struts2 json插件入门指南.pdf

    小结 本文介绍了如何使用Struts2的JSON插件处理JSON数据。通过不同的配置选项和示例,读者可以了解到如何灵活地控制返回的JSON数据格式。无论是使用XML配置还是注解方式,Struts2都提供了丰富的选项来满足不同的...

    ajax and jQuery

    #### 九、小结 通过本章的学习,我们可以了解到AJAX的基本原理及其在JavaScript和jQuery中的应用。此外,还介绍了如何利用AJAX实现异步用户名校验的功能,并简要探讨了BaseServlet设计模式、JSON数据格式以及JSON-...

    protobuf与json转换小结

    首先,protobuf生成的对象通常包含了一些非标准的数据类型,如`byte[]`,这在直接使用常见的JSON库(如jsonlib)进行转换时可能会遇到问题。因为JSON规范要求键(key)必须是字符串,而protobuf对象的get方法可能...

    Extjs学习带注释

    - **小结**:回顾并总结 Extjs 的基础知识,为后续的学习打下坚实的基础。 #### 四、消息框 - **基本概念**:了解消息框的作用和种类,包括提示框、输入框、确认框等。 - **实现方式**:学习如何在 Extjs 中实现...

    docker-修改容器挂载目录的3种方法小结

    2、vim /var/lib/docker/containers/container-ID/config.v2.json 修改配置文件中的目录位置,然后保存退出  “MountPoints”:{“/home”:{“Source”:”/docker”,”Destination”:”/home”,”RW”:true,”Name...

    轻松搞定Extjs_原创

    ### Extjs教程知识点总结 #### 第一章:序 - **主要内容**:简要介绍Extjs框架,并概述后续章节的学习内容。 #### 第二章:准备与资源 - **下载**:指导如何从官方...- **小结**:回顾综合项目的整体架构和技术要点。

    angular第三方包开发整理(小结)

    我们可以使用npm或yarn初始化项目,并配置tsconfig.json以支持TypeScript和Angular的特性。 首先,创建一个新的目录并初始化npm包: ``` mkdir my-ng-lib cd my-ng-lib yarn init ``` 接下来,安装必要的...

    程序设计训练之 Rust 编程语言 第五讲:项目管理与常用库

    #### 小结 通过学习本章节的内容,我们可以了解到 Rust 提供了一套完整的工具链来帮助开发者有效地管理大型项目,并通过智能指针和丰富的生态系统库支持高效的软件开发。理解这些概念和工具将大大提高 Rust 开发者...

    cira:Cira算法交易变得容易。 来自羊驼市场的羊驼贸易API的一个更简单的库

    这个名字是小羊驼的意思,因为这是一个小巧的lib,所以我认为它是一个完美的选择。 是的BDFL。 结帐事项:入门您可以使用快速安装您可以使用安装它。 pip install cira用法由于羊驼贸易API需要API密钥,因此您需要...

Global site tag (gtag.js) - Google Analytics