복붙노트

[JQUERY] 캐릭터 라인 화 (JSON로 변환하는) 순환 참조하여 자바 스크립트 객체

JQUERY

캐릭터 라인 화 (JSON로 변환하는) 순환 참조하여 자바 스크립트 객체

해결법


  1. 1.또는 간접적으로 (A -> B -> a) - 직접 객체 자체 인 오브젝트의 속성 (> A A)에있을 때 원형 구조체 오차가 발생한다.

    또는 간접적으로 (A -> B -> a) - 직접 객체 자체 인 오브젝트의 속성 (> A A)에있을 때 원형 구조체 오차가 발생한다.

    오류 메시지가 나타나지 않도록하기 위해서는 순환 참조가 발생할 때 무엇을 JSON.stringify을 말한다. 당신은 예를 들어, 한 사람이 다른 사람 ( "부모")을 가리키는하는 (또는 수도 없다) 원래 사람을 가리킨 다음을 수행합니다 :

    JSON.stringify( that.person, function( key, value) {
      if( key == 'parent') { return value.id;}
      else {return value;}
    })
    

    캐릭터 라인 화하는 두 번째 파라미터는 필터 함수이다. 여기에는 단순히 ID에 언급 된 개체를 변환,하지만 당신은 당신이 순환 참조 휴식을 원하는대로 할 무료입니다.

    당신은 다음에 위의 코드를 테스트 할 수 있습니다 :

    function Person( params) {
      this.id = params['id'];
      this.name = params['name']; 
      this.father = null;
      this.fingers = [];
      // etc.
    }
    
    var me = new Person({ id: 1, name: 'Luke'});
    var him = new Person( { id:2, name: 'Darth Vader'});
    me.father = him; 
    JSON.stringify(me); // so far so good
    
    him.father = me; // time travel assumed :-)
    JSON.stringify(me); // "TypeError: Converting circular structure to JSON"
    // But this should do the job:
    JSON.stringify(me, function( key, value) {
      if(key == 'father') { 
        return value.id;
      } else {
        return value;
      };
    });
    

    이 예약 된 다양한 언어로 단어 (그리고 DOM에이)이기 때문에 BTW, 나는 "부모"에 다른 속성의 이름을 선택 것입니다. 이 길 아래에 혼란을 야기하는 경향이 ...


  2. 2.그 도장이 형태로 JSON에 순환 참조를 나타낼 수 있습니다 나타납니다 : { "ID": "1", "나": { "$ REF": "1"}}

    그 도장이 형태로 JSON에 순환 참조를 나타낼 수 있습니다 나타납니다 : { "ID": "1", "나": { "$ REF": "1"}}

    다음은 그 예이다 :

    http://jsfiddle.net/dumeG/

    require(["dojox/json/ref"], function(){
        var me = {
            name:"Kris",
            father:{name:"Bill"},
            mother:{name:"Karen"}
        };
        me.father.wife = me.mother;
        var jsonMe = dojox.json.ref.toJson(me); // serialize me
        alert(jsonMe);
    });​
    

    생성합니다 :

    {
       "name":"Kris",
       "father":{
         "name":"Bill",
         "wife":{
              "name":"Karen"
          }
       },
       "mother":{
         "$ref":"#father.wife"
       }
    }
    

    참고 : 당신은 또한 드 직렬화 dojox.json.ref.fromJson 방법을 사용하여 이러한 순환 참조 된 객체.

    기타 리소스 :

    순환 참조가있는 경우에도 어떻게 JSON에 DOM 노드를 직렬화?

    JSON.stringify는 순환 참조를 나타낼 수 없습니다


  3. 3.I는 JSON 원형 참조를 처리하는 두 적합한 모듈을 알았다.

    I는 JSON 원형 참조를 처리하는 두 적합한 모듈을 알았다.

    이들 중 하나는 당신의 필요를 충족해야한다.


  4. 4.내가 페이지에 복잡한 객체를 기록 할 필요가 있었기 때문에 원격 디버깅 내 특정 상황에서는 불가능 이후,이 스레드에 일어났다. 그들이 분석 한 후 다시 연결할 수있는 문자열과 같은 순환 참조를 주석 더글러스 크록 포드의 (JSON의 inceptor) 자신의 cycle.js을 발견했다. 탈 순환 전체 복사본이 작업은 JSON.stringify을 통과하는 것이 안전합니다. 즐겨!

    내가 페이지에 복잡한 객체를 기록 할 필요가 있었기 때문에 원격 디버깅 내 특정 상황에서는 불가능 이후,이 스레드에 일어났다. 그들이 분석 한 후 다시 연결할 수있는 문자열과 같은 순환 참조를 주석 더글러스 크록 포드의 (JSON의 inceptor) 자신의 cycle.js을 발견했다. 탈 순환 전체 복사본이 작업은 JSON.stringify을 통과하는 것이 안전합니다. 즐겨!

    https://github.com/douglascrockford/JSON-js


  5. 5.대체물 아래의 사용 (유사 JSON 경로) / 원형 참조 된 개체를 복제하는 문자열 참조와 JSON 생성

    대체물 아래의 사용 (유사 JSON 경로) / 원형 참조 된 개체를 복제하는 문자열 참조와 JSON 생성

    let s = JSON.stringify(obj, refReplacer());
    

    refReplacer 함수 () { m은 = 새지도 (), V는 새로운지도를 () =하자, 초기화 = NULL; 창 함수 (필드 값) { p = m.get (이) + (Array.isArray (이)를 '[$ {} 필드]'? '.'+ 필드)하자; isComplex하자 = 값 === 객체 (값) 경우 (isComplex) m.set (값, P); PP = v.get (값)을 보자 || '; 하자 경로 = p.replace (미정 / \ \ /, ''..?); 발 = 쪽을 보자? #REF '$ {PP [0] =='[ '? '$': '$.'} $ {PP}`: 값; ! init을? (INIT = 값) : (브로 === INIT 브로 = "#의 REF : $": 0); 만약 v.set (값, 경로) (PP isComplex &&!); 발을 반환; } } // --------------- // 테스트 // --------------- 중복 참조가 // 세대 OBJ A = {1, A2 : A1 2}하자; B = {B1 : 3, B2 : "4"}하자; OBJ = {O1을 {를 O2 : A}, B, A}하자; // 중복 참조 a.a3 = [1,2, B] // 순환 참조 b.b3 = A; // 순환 참조 들 (refReplacer (), 4- OBJ)를 JSON.stringify =하자; CONSOLE.LOG (S);

    그리고 그러한 "REF-JSON"에서 중생 객체에 대한 파서 기능 다음

    함수 parseRefJSON JSON () { objToPath 새로운지도를 () =하자; ) (pathToObj 새로운지도 =하자; O = JSON.parse JSON ()을 보자; {트래버스 = (부모 필드) =>를 보자 = 부모 OBJ하자; 경로 = '# REF를 : $'를 보자; (필드! == 정의되지 않은) 경우에 { 부모 = OBJ [분야]; 경로 = objToPath.get (부모) + (Array.isArray (부모) '[$ {} 필드]': '$ {필드 + 필드?'. '' '}?'); } objToPath.set (OBJ 경로); pathToObj.set (경로 OBJ); REF = pathToObj.get (OBJ)를 보자; 경우 (REF) 부모 [분야] = (REF); 대한 (하자 F에서 OBJ) 경우 (OBJ === 객체 (OBJ)) 트래버스 (OBJ, F); } 트래버스 (O); O를 반환; } // ------------ // 테스트 // ------------ {`= S를하자 "O1": { "O2": { "A1"(1) "A2": 2, "A3": 1, 2, { "B1"3 "B2": "4", "B3": "# REF :. $ o1.o2" } ] } }, "B": "# REF :. $ o1.o2.a3 [2]" "A": "# REF :. $ o1.o2" }`; 을 console.log ( '열기 크롬 콘솔은 중첩 된 필드를 볼 수 있습니다 :'); 하자 OBJ = parseRefJSON (들); CONSOLE.LOG (OBJ);


  6. 6.나는이 순환 참조를 제거하려면 다음을 사용 :

    나는이 순환 참조를 제거하려면 다음을 사용 :

    JS.dropClasses = function(o) {
    
        for (var p in o) {
            if (o[p] instanceof jQuery || o[p] instanceof HTMLElement) {
                o[p] = null;
            }    
            else if (typeof o[p] == 'object' )
                JS.dropClasses(o[p]);
        }
    };
    
    JSON.stringify(JS.dropClasses(e));
    
  7. from https://stackoverflow.com/questions/10392293/stringify-convert-to-json-a-javascript-object-with-circular-reference by cc-by-sa and MIT license