json 해결, There is a cycle in the hierarchy, 하나의 관련 층 으로 만 순환

오늘 자바 분석 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);
내 가 hibenate 에 게 서 얻 은 것 은 list 이기 때문에 호출 하 러 갔다from Collection 방법, 안에 있 는 방법 에서 문 제 를 발견 합 니 다. 이 방법 은 실체 속성 을 계속 뜯 어서 없 을 때 까지 합 니 다.
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 클래스 를 볼 수 있 습 니 다. 다 대 일 하면, 만약, 만약...
List attentions=(List) resultMap.get("ownPage_ownAttentionList");
JASONARray. from Object (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());

좋은 웹페이지 즐겨찾기