`
seyaa
  • 浏览: 55619 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

json格式化错误

    博客分类:
  • JSON
阅读更多
    前一片我简单说了json格式数据与对象直接的转换。
    但是有时候你会发现,出问题了,数据格式化不了,还报了错误,怎么回事?
    以下是我出现的错误:
   
Exception in thread "main" net.sf.json.JSONException: There is a cycle in the hierarchy!
	at net.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
	at net.sf.json.JSONObject._fromBean(JSONObject.java:833)
	at net.sf.json.JSONObject.fromObject(JSONObject.java:168)
	at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)
	at net.sf.json.JSONObject._processValue(JSONObject.java:2808)
	at net.sf.json.JSONObject.processValue(JSONObject.java:2874)
	at net.sf.json.JSONObject.setInternal(JSONObject.java:2889)
	at net.sf.json.JSONObject.setValue(JSONObject.java:1577)
	at net.sf.json.JSONObject._fromBean(JSONObject.java:934)
	at net.sf.json.JSONObject.fromObject(JSONObject.java:168)
	at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)
	at net.sf.json.JSONArray._processValue(JSONArray.java:2514)
	at net.sf.json.JSONArray.processValue(JSONArray.java:2539)
	at net.sf.json.JSONArray.addValue(JSONArray.java:2526)
	at net.sf.json.JSONArray._fromCollection(JSONArray.java:1057)
	at net.sf.json.JSONArray.fromObject(JSONArray.java:123)
	at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:237)
	at net.sf.json.JSONObject._processValue(JSONObject.java:2808)
	at net.sf.json.JSONObject.processValue(JSONObject.java:2874)
	at net.sf.json.JSONObject.setInternal(JSONObject.java:2889)
	at net.sf.json.JSONObject.setValue(JSONObject.java:1577)
	at net.sf.json.JSONObject._fromBean(JSONObject.java:934)
	at net.sf.json.JSONObject.fromObject(JSONObject.java:168)
	at net.sf.json.JSONObject.fromObject(JSONObject.java:130)
	at test.Test2.main(Test2.java:28)

    一开始的时候我也疑惑是怎么回事,之前的都可以正常格式化,为什么这样不行,后来在别人的指导下检查了代码,发现因为我使用了自身关联(我这样叫他)。
    代码如下:
   
package test;

import java.util.List;

public class ClassS {
	//id
	private int id ;
	//班级名称
	private String name;
	//拥有的学生
	private List<Student> students;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List<Student> getStudents() {
		return students;
	}
	public void setStudents(List<Student> students) {
		this.students = students;
	}
	public ClassS(int id, String name, List<Student> students) {
		super();
		this.id = id;
		this.name = name;
		this.students = students;
	} 
	
	
}

package test;

public class Student {
	//id
	private int id ;
	//名称
	private String name;
	//年龄
	private int age;
	//性别
	private String gender;
	//住址
	private String address;
	//身份证id
	private String cdCard;
	//所属班级
	private ClassS classs;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getCdCard() {
		return cdCard;
	}
	public void setCdCard(String cdCard) {
		this.cdCard = cdCard;
	}
	public ClassS getClasss() {
		return classs;
	}
	public void setClasss(ClassS classs) {
		this.classs = classs;
	}
	public Student(int id, String name, int age, String gender, String address,
			String cdCard) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.address = address;
		this.cdCard = cdCard;
	}
}

 public static void main( String[] args ){
    
    	Student stu1 = new Student(1, "goodboy",20,"boy","我的老家在东北,家住松花江上啊", "123456789123456789");
    	Student stu2 = new Student(2, "goodboy",20,"boy","我的老家在东北,家住松花江上啊", "123456789123456789");
    	List<Student> stus = new ArrayList<Student>();
    	
    	stus.add(stu1);
    	stus.add(stu2);
    	ClassS classs = new ClassS(1,"class1",stus);
    	stu1.setClasss(classs);
    	stu2.setClasss(classs);
    	System.out.println(JSONObject.fromObject(classs));
    }

    从上面看出代码都是正确的,但是你会发现在ClassS与Student是一对多的关系,及一个班级对应了多个学生,而在Student中又对应了所属的班级:
  
//所属班级
	private ClassS classs;

   结果json在格式化ClassS 这个对象的时候在进行格式化其内部的对象时候,由于json是深度递归进行格式化的又回到了其自身,结果就成了一个死循环,问题就出现了。既然有问题肯定要解决,怎么解决呢?我的方法是过滤掉其自身的关联,json的JSONObject和JSONArray都提供了这个过滤的机制:
 
JSONObject.fromObject(object, jsonConfig)
JSONArray.fromObject(object, jsonConfig)


所以我自己写了一个过滤的类:
package test;


import net.sf.json.JsonConfig;
import net.sf.json.util.PropertyFilter;
/**
 *
 * 功能描述:过滤掉格式化数据为json格式的时候的自身关联
 * 
 */
public class FiltrateUtil {

	public static JsonConfig filtrate(final String[] str) {
		JsonConfig config = new JsonConfig();
		config.setJsonPropertyFilter(new PropertyFilter() {
			public boolean apply(Object source, String name, Object value) {
				if(str!=null&&str.length>0){
					boolean flag = false;
					for(int i = 0;i<str.length;i++){
						if (name.equals(str)) {
							flag = true;
							break;
						}
					}
					return flag;
				}else{
					return false;
				}
			}
		});
		return config;
	}
}

    然后在把测试的代码修改下,如下:
   
System.out.println(JSONObject.fromObject(classs,FiltrateUtil.filtrate(new String[]{"classs"})));

   我想要的json字符就正常的被打印出来了。

  
{"id":1,"name":"class1","students":[{"address":"我的老家在东北,家住松花江上啊","age":20,"cdCard":"123456789123456789","gender":"boy","id":1,"name":"goodboy"},{"address":"我的老家在东北,家住松花江上啊","age":20,"cdCard":"123456789123456789","gender":"boy","id":2,"name":"goodboy"}]}
1
0
分享到:
评论

相关推荐

    离线json格式化查看工具下载

    标题提到的“离线json格式化查看工具”是一种独立的软件,无需网络连接即可使用,对于开发者来说非常方便。这类工具的主要功能包括: 1. **格式化**:当JSON数据以紧凑的形式(单行无缩进)存在时,格式化工具可以...

    JSON格式化工具-JSON格式化美化工具

    标题提及的“JSON格式化工具”是专门用来处理JSON数据的实用程序,它可以帮助用户更清晰地查看和理解复杂的JSON结构。这些工具通常具备以下功能: 1. **格式化**:将原始的、紧凑的JSON字符串转换为易读的格式,...

    json格式化小程序

    "Json格式化小程序"是为了帮助开发人员解决在处理JSON数据时,代码可能因为手动编辑或传输过程中的格式混乱问题而设计的工具。 这个小程序的主要功能是对JSON代码进行美化和格式化,使得原本紧凑无格式的JSON字符串...

    Json格式化工具

    在开发过程中,特别是涉及到前后端交互时,JSON格式化工具如HiJson能够帮助开发者快速定位问题,例如检查错误的键值对、验证JSON结构是否符合规范,或是找出导致程序异常的特定部分。这不仅提高了工作效率,也减少了...

    Mac版json格式化工具

    在处理JSON文件时,有时由于数据过于复杂,原始的文本格式会显得杂乱无章,这时就需要使用JSON格式化工具来美化和整理这些数据。 对于Mac用户来说,"Mac版json格式化工具"是一个必不可少的辅助软件,它可以将混乱的...

    好用的本地json格式化小工具,无需联网

    因此,JSON格式化工具就显得尤为重要。 标题提到的“好用的本地json格式化小工具”是针对这一需求而设计的,它允许用户在离线环境下对JSON数据进行美化,使其更易读。这类工具通常具有以下功能: 1. **格式化**:...

    Json格式化查看器

    JSON格式化查看器则是用来美化和清晰地展示JSON数据的工具,帮助开发者更方便地查看和理解JSON结构。 “Json格式化查看器”是一款桌面应用程序,专门针对JSON数据的查看和管理。它具有以下特点: 1. **折叠与展开*...

    Editplus JSON格式化插件.zip

    **EditPlus JSON格式化插件**是一款专为提升开发者在使用**EditPlus**文本编辑器时处理JSON数据效率而设计的实用工具。EditPlus是一款功能强大的文本编辑器,广泛用于编写代码、HTML、PHP、Java等,但它原生并不具备...

    json格式化软件

    3. **错误检查**:一些高级的JSON格式化工具还会提供错误检查功能,如果输入的JSON字符串不符合语法规则,会给出错误提示。 4. **代码高亮**:为了提高可读性,软件通常会对不同的数据类型使用不同的颜色进行高亮...

    JSON格式化工具

    JSON格式化工具则帮助开发者将杂乱无章的JSON数据整理成结构清晰、易读的形式,便于理解和调试。 这款"JSON格式化工具"是一款绿色免安装版本,无需复杂的安装过程,只需解压缩文件包,找到并运行"JsonView.exe"这个...

    谷歌浏览器Json格式化插件,浏览器接口调试json

    标题中的“谷歌浏览器Json格式化插件,浏览器接口调试json”指的是在Google Chrome浏览器中用于解析和美化JSON数据的扩展程序。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务和...

    json离线格式化工具

    在处理大量JSON数据时,为了便于理解和调试,我们通常会需要使用JSON格式化工具。 "json离线格式化工具"是一款专为处理JSON数据设计的实用工具,它允许用户在没有网络连接的情况下对JSON数据进行美化和解析。这个...

    json格式化工具

    JSON格式化工具是用来帮助开发者将混乱的JSON字符串整理成易读的格式,这对于调试、分析或检查JSON数据非常有用。这类工具通常具有以下功能: 1. **美化输出**:将一串未经格式化的JSON文本,通过添加缩进和换行,...

    JSON格式化和编辑工具

    对于开发人员而言,掌握JSON格式化和编辑工具的使用是非常重要的技能,尤其是在处理API接口、前后端交互、配置文件等场景下,能有效提升工作效率,减少错误。而"HiJson"这样的工具,则提供了这样一个实用的平台,...

    Json 格式化工具

    而"JSON格式化_files"文件夹则可能包含了页面运行所需的CSS样式表、JavaScript脚本和其他相关资源。这些资源共同协作,使得用户可以在本地环境中方便地进行JSON数据的格式化操作,而无需依赖任何在线服务。 使用...

    Json和Xml离线格式化工具

    `JsonFormatTools`很可能是一个专门处理JSON格式化的工具,提供上述提到的JSON格式化功能。而`XmlFormat_1.0`可能是一个XML格式化工具的早期版本,同样具备基本的XML格式化和解析功能。 掌握JSON和XML的格式化工具...

Global site tag (gtag.js) - Google Analytics