>source

제 code는 다음과 같습니다.

BAD= {
          "a": "2",
          "b": 1,
          "c": "Nexus",
          "d": "Alligator",
          "e": 5,
          "f": 1431807036,
          "g": {
                    "2": {
                            "w": 17,
                            "b": 5
                         }
               }
      }
console.log(JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g']));

http://jsfiddle.net/whv7x6xc/1/

,,,,이자형, 그리고G문자열화되는 유일한 것은 좋지만 한 가지 문제가 있습니다. 에 할당된 개체를 무시합니다.G.

하지만 다음과 같은 경우:console.log(JSON.stringify(나쁜));적절한 문자열 버전을 보여줍니다.

편집:그리고동적이며 주기적으로 변경되므로(왔다가 나가기) 하드코딩할 수 없습니다.

글쎄, g 속성의 해당 개체에는 속성 이름의 화이트리스트에 없는 "2" 속성만 있습니다. 그렇다면 왜 나타날 것으로 예상합니까?

Bergi2022-02-05 19:51:49

객체의 모든 속성이 결과 JSON 문자열에 포함되기 때문입니다. 개체의 모든 속성(내 경우에는 g)이 포함되어 있음을 명확하게 나타냅니까?

NiCk Newman2022-02-05 19:51:49

어디에서 명시되어 있습니까? 그것은 완전히 잘못되었습니다(열거할 수 없고 상속된 JSON 값이 아닌 속성 등에 대해).

Bergi2022-02-05 19:51:49

@NiCkNewman 허용 목록에 추가하려는 모든 개체에 대한 속성을 제공해야 합니다. 여기에는 BAD.g 개체 및 BAD.g.2에 대한 키가 포함됩니다.

Dom2022-02-05 19:51:49

아니요, 배열의 값에 대해 말하는 것이 아니라 배열 자체를 JSON.stringify에 대한 인수로 제공하는지 여부에 대한 것입니다. console.log(JSON.stringify(BAD))를 사용하는 경우 기본적으로 표시되는 모든 속성이 포함됩니다. 대체(예: 함수 또는 배열)를 전달하면 모든 속성에 대체 규칙이 적용됩니다.

Bergi2022-02-05 19:51:49
  • 답변 # 1

    다음과 같은 매개변수에 두 개의 키를 더 추가합니다.

    JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g', '2', 'w'])
    

    출력

    깡깡이

  • 답변 # 2

    교체자첫 번째 수준이 아니더라도 모든 속성의 문자열화에 영향을 미친다는 점에서 논쟁이 깊습니다. 추가하면"2"배열에 개체가 문자열화되어 있음을 알 수 있습니다."와", 왜냐하면"와"교체자가 허용 목록에 없습니다.

    JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g', '2'])
    

    사용하는 이유 고려교체자. 화이트리스트 대신 블랙리스트에 사용하는 경우 배열이 아닌 함수를 전달하는 것이 더 나을 수 있습니다.

    JSON.stringify(BAD, function replacer(key, value) {
      var blacklist= ['b', 'g']
      return blacklist.indexOf(key)=== -1 ? value : undefined
    })
    

  • 답변 # 3

    JSON 교체자는 재귀적입니다. 그러면 모든개체에 대해 동일한 배열을 사용한다는 의미입니다. 즉, 동일한 값을 사용하여 매핑합니다.나쁜지의 가치. 부터,나쁜지의 값에는 제공한 것과 일치하는 키가 없으며 아무 것도 제대로 매핑되지 않습니다. 이것은 배열에 "2"를 추가해야 함을 의미합니다. 이제 "2"에도 다른 키가 있는 개체가 있습니다. 우리는 이미 "b"를 설명했으므로 이제 배열에 "w"를 추가하기만 하면 됩니다.

    대체자에게 배열을 제공할 때 배열을 매핑하려는 모든키의 목록으로 생각하는 것이 가장 좋습니다.

    데모: http://jsfiddle.net/dirtyd77/whv7x6xc/4/

    console.log(JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g', '2', 'w']));
    

    이 정보가 도움이 되었기를 바라며 질문이 있으면 알려주세요.


    다음은 ,

    다른 객체를 반환하면 객체가 JSON 문자열에 재귀적으로 문자열화되어 각 속성에 대해 replacer 함수를 호출합니다. 단, 객체가 함수가 아니면 JSON 문자열에 아무것도 추가되지 않습니다.


    동적 키의 경우 항상 배열에 푸시하는 함수를 만들고 해당 배열을 허용 목록에 사용할 수 있습니다. 다음은 예입니다.

    데모: http://jsfiddle.net/dirtyd77/whv7x6xc/5/

    var BAD= {
        "a": "2",
        "b": 1,
        "c": "Nexus",
        "d": "Alligator",
        "e": 5,
        "f": 1431807036,
        "g": {
            "2": {
                "w": 17,
                "b": 5
            }
        }
    }
    var whitelist= [];
    iterate(BAD);
    console.log(whitelist, JSON.stringify(BAD, whitelist));
    function iterate(obj){
        for(var key in obj){
            //may have to do some checking to ignore any keys you don't care about
            whitelist.push(key);
            //if value is an object, will use this same function to push to whitelist array
            if(typeof obj[key]=== 'object'){
                return iterate(obj[key]);
            }
        }
    }
    


    기존의화이트리스트키를 추가하기만 하면G키(동적이지 않은 경우):

    데모: http://jsfiddle.net/dirtyd77/whv7x6xc/6/

    var whitelist= ['a', 'b', 'c', 'd', 'e', 'g'];
    iterate(BAD.g);
    console.log(whitelist, JSON.stringify(BAD, whitelist));
    function iterate(obj){
        for(var key in obj){
            whitelist.push(key);
            if(typeof obj[key]=== 'object'){
                return iterate(obj[key]);
            }
        }
    }
    

    문서에서 내가 이해한 바에 따르면 객체의 모든 속성은 결과 JSON 문자열에 포함됩니다. 제 경우에는 g의 속성이 포함됩니다. 또한 2와 w는 동적이므로(내 플레이어가 장착한 항목을 기반으로 ^^), 해당 값을 하드 코딩할 수 없습니다. 임시 배열을 만들고 g의 속성을 푸시해야 합니까(Object로 이 작업을 수행할 수 있습니다. 키)를 교체자에게 보내려면?

    NiCk Newman2022-02-05 19:51:49

    @NiCkNewman이 편집했지만 내가 만든 반복 기능은 모든 키를 화이트리스트에 푸시합니다. 신경 쓰지 않는 키를 무시하려면 몇 가지 검사를 수행해야 할 수도 있습니다. 더 필요한 것이 있으면 알려주세요!

    Dom2022-02-05 19:51:49

    또는 다음을 수행할 수도 있습니다... var whitelist= ['a', 'b', 'c', 'd', 'e', ​​'g']; 그리고 BAD.g를 반복합니다. -iterate(BAD.g); jsfiddle.net/dirtyd77/whv7x6xc/6

    Dom2022-02-05 19:51:49

    알았어, 난 바보야 문서가 재귀적이라고 말했을 때 해당 객체 아래의 모든 것이 문자열화되었다고 생각했습니다. 그러나 그것이 제 문제입니다. 왜냐하면 정의상 재귀는 다음과 같습니다. 프로그램이나 루틴의 일부가 전체의 적용을 필요로 하므로 명시적 해석이 일반적으로 많은 연속적인 실행을 필요로 하는 프로그램이나 루틴과 관련되거나 포함됩니다. 반복되는 부분은 해당 객체의 모든 속성을 문자열화하는 것을 의미하지만 재귀는 기본적으로 반복되는 것을 의미한다고 계속 생각했습니다. 그리고 이 경우 교체자는 매개변수에 대한 키의 교체자를 반복합니다.

    NiCk Newman2022-02-05 19:51:49
  • 이전 javascript : 기본 매개변수를 포함한 함수 매개변수 길이 가져오기
  • 다음 javascript : LocalStorage 개체에 응답 데이터 추가