今天使用java解析json遇到There is a cycle in the hierarchy错误,也就是类与类之间关联,http://blog.csdn.net/jazywoo123/article/details/8681555
JSONArray根据判断取得的不同类型调用相应的方法,
if (object instanceof Collection)
return _fromCollection((Collection)object, jsonConfig);
而我从hibernate那得到的是list,所以去调用了_fromCollection方法,而里面的方法发现一个问题:该方法会不断的拆开实体属性,直到没有为止
package bijian.model.bean;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class User{
private long userID;
private String username;
private String nickname;
private String password;
private Integer sex;
private Integer age;
private String photo;
private Date createTime;
private Integer loginState;
private Integer hotValue;
private Integer attentionNum;
private Integer followingNum;
private Integer sentenceNum;
private Integer visitNum;
private Set attentions=new HashSet();
private Set followings=new HashSet();
private Set friends=new HashSet();
private Set chats=new HashSet();
private Set notices=new HashSet();
private Set messages=new HashSet();
private Set sentences=new HashSet();
private Set receiveComments=new HashSet();
private Set sendComments=new HashSet();
private Set reportSentences=new HashSet();
private Set relatedSentences=new HashSet();
private Set loveSentences=new HashSet();
private Set labelUsers=new HashSet();
private Set subscribeLabels=new HashSet();
......................................
}
package bijian.model.bean.relationbean;
import java.util.Date;
import bijian.model.bean.User;
public class Attention {
private long attentionID;
private User self;
private User attentioner;
private Date createTime;
private Integer isValid;
..........................
}
可以看出Attention类 多对一 User类,如果有
List<Attention> attentions=(List<Attention>) resultMap.get("ownPage_ownAttentionList");
JASONArray.fromObject(attentions) 就会报错 ,具体参见http://blog.csdn.net/jazywoo123/article/details/8681555
但是我想要保留attention中的User属性,但是不过滤User中其他的属性,即
[{"attentionID":1, "attentioner":{"age":12,"attentionNum":2,"createTime":null,"followingNum":0,"hotValue":34,"loginState":0,.......................................
attentioner是一个User对象,但是User对象中的那些复杂的对象属性过滤掉。
可以看到JASONArray的方法中JsonConfig是一层层传下去的,即过滤完Attention之后,又使用在User转json中
if (object instanceof Collection)
return _fromCollection((Collection)object, jsonConfig);
因此,可以在过滤Attention的属性中加上User的属性
private JsonConfig jsonFilterProperty(final List<String> properties){
JsonConfig config=new JsonConfig();
config.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor());
if(properties!=null&&properties.size()>0){
config.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object object, String name, Object value) {
if(containsElement(properties,name)){
//System.out.println("-- 过滤 "+name+"----");
return true;
}
return false;
}
});
}
return config;
}
private <T> boolean containsElement(List<T> list,Object object){
for(T l:list){
if(l.toString().equals(object.toString()) ){
return true;
}
}
return false;
}
//得到root命名下的List的json,过滤掉properties中的字段
private <T> String getJson(String root,List<T> list,List<String> properties){
JsonConfig config=jsonFilterProperty(properties);
JSONArray sentenceListJson=JSONArray.fromObject(list,config);
JSONObject jsonObject=new JSONObject();
jsonObject.put(root, sentenceListJson);
return jsonObject.toString();
}
//输出json
private <T> String printJson(String root,List<T> list,String className){
if(list==null) return null;
String resultJson = null;
if(list.size()>0){
List<String> properties=new ArrayList<String>();
if(className.equals("User")){
addProperty(properties,className);
}else if(className.equals("Sentence")){
addProperty(properties,className);
}else if(className.equals("Label")){
addProperty(properties,className);
}else if(className.equals("Attention")){
addProperty(properties,"User");
}else if(className.equals("Following")){
addProperty(properties,"User");
}else if(className.equals("SubscribeLabel")){
addProperty(properties,"Label");
addProperty(properties,"User");
}else if(className.equals("LoveSentence")){
addProperty(properties,"User");
addProperty(properties,"Sentence");
}
resultJson=getJson(root, list, properties);
System.out.println(resultJson);
}
return resultJson;
}
private void addProperty(List<String> properties,String className){
if(className.equals("User")){ //生成json时过滤User的这些属性,以免产生循环错误
properties.add("attentions");
properties.add("followings");
properties.add("friends");
properties.add("chats");
properties.add("notices");
properties.add("messages");
properties.add("sentences");
properties.add("receiveComments");
properties.add("sendComments");
properties.add("reportSentences");
properties.add("relatedSentences");
properties.add("loveSentences");
properties.add("labelUsers");
properties.add("subscribeLabels");
}else if(className.equals("Sentence")){//生成json时过滤Sentence的这些属性,以免产生循环错误
properties.add("author");
properties.add("comments");
properties.add("labelSentences");
}else if(className.equals("Label")){//生成json时过滤Label的这些属性,以免产生循环错误
properties.add("labelSentences");
properties.add("labelUsers");
properties.add("subscribeLabels");
}
}
这样之后,调用,即可让Attention转json进行到User之后不往下循环
List<Attention> attentions=(List<Attention>) resultMap.get("ownPage_ownAttentionList");
printJson("attentionList", attentions, Attention.class.getSimpleName());