前一片我简单说了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"}]}
分享到:
相关推荐
Json验证和格式化工具,贴上字符串如果是json会自动格式化,如果不是json会提示错误内容,非常实用
这是一个json格式化的工具,可视化的界面,对json格式验证错误,按每个节点的描述
javascript-json校验模块 支持 1.json字符串格式化 2.json格式错误报错3.错误所在行标出4.直接放在iframe或者模块里面就可以使用
json校验工具,支持 1.json字符串格式化 2.json格式错误报错,找出报错所在行并标出
HiJson是一款Json格式化工具64位版,HiJson 2.1.2_jdk64是线下json格式化工具,可以非常方便的查看json格式是否错误。支持打开多个标签,每个标签换行整齐显示很方便。
一个JSON编辑工具,可以用来查看JSON格式文件的数据。能够查看到json文件格式的内容,能够预览结构及format等,最重要的的是可以进行快速校验,进行错误定位。
此工具可以,格式化JSON,并且检查处错误,C#编写!
json字符串工具 格式化json 图形化查看json对象 错误格式检测
目录自动格式化代码更改页面<title> 安装依赖项导入组件代码分割添加样式表后处理CSS 添加CSS预处理器(Sass,Less等) 添加图像,字体和文件使用public文件夹更改HTML 在模块系统之外添加资产何时使用public...
能很好的格式化json数据,有错误的提示,使用方便,很适合查看JSON数据。 The JSON View package is a set of 3 viewers available in the following flavors: 1) A standalone viewer - JsonView.exe 2) A plugin ...
绿色免安装版 JSON离线校验、格式化、视图工具,可以将输入的JSON格式生成相应的树状视图。支持JSON校验时错误信息提示。http://www.bejson.com 二次开发
全力打造最好用的json格式化工具,欢迎一起来玩! 访问地址 网站: : FuncLib: ://www.funclib.net GitHub: : GitHub: : 家庭界面 对比界面 简单介绍 转杰森是使用MEAN-STACK(MongoDB + Express + ...
一款轻便的json转换工具,和后台交互的桥梁,格式化后的数据,结构清晰,一目了然
杰森·普雷捷 :laptop: 开源JSON格式器Web应用程序。 关于该项目的目标是创建开发人员想要的JSON格式。 关键概念是: :female_sign: 美丽,使用开发人员喜欢使用的样式。 :broom: 清洁,设计简单客观。 :unlocked:...
SSM笔记-SpringMVC的数据格式化 、数据校验、错误提示、错误信息国际化、返回json
JSON格式化程序,用于格式化从外部来源(如数据库)复制的JSON。 向用户提供输入JSON的五颜六色的表示形式和格式良好的输出(如果有效)。否则,向用户提供错误消息,说明JSON为什么验证失败。 支持语言:English
绿色免安装版 JSON离线校验、格式化、视图工具,可以将输入的JSON格式生成相应的树状视图。支持JSON校验时错误信息提示。
验证:语法错误和架构验证 格式设定 文件符号 语法高亮 匹配包含以下format: "color-hex"'的模式的所有属性的颜色修饰符format: "color-hex"' (非标准模式扩展名) 架构可以通过配置来提供。 请参阅以获取JSON插件...
症状:后台返回给页面的数据是Json格式的,其中的日期字段,在后台是“2012-11-10 12:18:00”这样的格式,json序列化后返回到前台页面就被转换成一个像 /Date(1419264000000)/ 的格式,导致easyUI无法解析这个字段。
HiJson是一款JSON格式化工具,可以检查json语法格式的错误及生成对应的对象树方便查看。