JSON에서 큰 따옴표를 이스케이프 처리하는 방법


306

큰 따옴표를 표시하려고하지만 백 슬래시 중 하나를 보여줍니다.

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

html로 렌더링하면으로 표시됩니다 \"Example text\". 올바른 방법은 무엇입니까?

답변:


446

이 시도:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

( \따옴표 앞에 하나의 백 슬래시 ( )).


9
@DWGuru이 코멘트를 함께 할 수 없다, 그것에서 설명 된 바와 같이 이스케이프 시퀀스의 ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (. 파 9 - 문자열)는 말한다 : All characters may be placed within the quotation marks except for the characters that must be escaped다음을 지정 :\" represents the quotation mark character (U+0022)
mastazi

어떤 이유로 든 JS의 JSON.parse ()에서는 작동하지 않습니다.
SacWebDeveloper

32

\\\"대신 언제 어디서 사용해야 합니까? 네가 나와 ​​같다면이 실을 찾은 후에 내가하고있는 일을 깨달았을 때와 똑같이 기분이 나빠질 것입니다.

.json 텍스트 파일 / 스트림을 만들고 거기에서 데이터를 가져 오는 경우 큰 따옴표 앞에 하나의 백 슬래시의 기본 스트림 응답이 있습니다 \".

그러나 당신이 나와 같고 w3schools.com "Tryit Editor"가 JSON.parse (text)의 출력에 큰 따옴표를 갖도록하려고한다면, 당신이 찾고있는 것은 트리플입니다 백 슬래시 큰 따옴표 \\\". HTML <script>블록 내에 텍스트 문자열을 작성 하고 첫 번째 이중 백 슬래시는 단일 백 슬래시를 문자열 변수에 삽입 한 후 다음 백 슬래시 큰 따옴표는 큰 따옴표를 문자열에 삽입하여 결과 스크립트 문자열에 \"from을 포함시키기 때문 입니다. 표준 답변과 JSON 파서는 이것을 큰 따옴표로 구문 분석합니다.

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1 : JavaScript 텍스트 문자열이기 때문에 큰 백 슬래시 큰 따옴표 \\"도 작동합니다. 큰 따옴표는 단일 인용 문자열의 예에서 탈출 필요하지 않기 때문에 '\"''"'같은 JS 문자열의 결과.


이 솔루션은 Swift 버전에서 JSON POST의 인수에 추가되는 문자열을 작성하는 데 도움이됩니다.
Nick N

18

백 슬래시도 이스케이프 처리되므로 백 슬래시가 표시됩니다.

큰 따옴표 외에도 JSON 따옴표로 묶은 문자열에 백 슬래시를 포함하려면 백 슬래시를 이스케이프 처리해야합니다. 그러나 이스케이프 시퀀스에 백 슬래시를 사용하려는 경우에는 이스케이프를 피해야합니다.


9

이는 콘텐츠가 "이중 인코딩"된 경우에 발생하며 인코딩 알고리즘이 실수로 두 번 호출되었음을 의미합니다.

첫 번째 호출은 "text2"값을 인코딩합니다.

FROM : Heute startet이 Rundreise "예제 ​​텍스트"를 원치 않습니다. 제이 덴 태그 (Jeden Tag)는 Reiseziel angesteuert bis wir.

TO : startet unesere Rundreise \ "Example text \"를 봅니다. 제이 덴 태그 (Jeden Tag)는 Reiseziel angesteuert bis wir.

그런 다음 두 번째 인코딩은 이미 이스케이프 된 문자를 이스케이프 처리하여 다시 변환합니다.

FROM : Runuteise가 "예제 텍스트 \"인 Heute startet. 제이 덴 태그 (Jeden Tag)는 Reiseziel angesteuert bis wir.

TO : startet unesere Rundreise \\\ "예제 텍스트 \\\"를 표시하십시오. 제이 덴 태그 (Jeden Tag)는 Reiseziel angesteuert bis wir.

따라서 여기에서 서버 구현을 담당하는 경우 동일한 컨텐츠를 인코딩하려는 두 단계가 없는지 확인하십시오.


6
내가 두 번째 생각 때문에 인코더는 이스케이프 스위치를 벗어날 것이라고 생각 님이 읽어야 : "Heute startet unsere Rundreise \\\"예 텍스트를 \\\ "Jeden 태그 wird EIN에서 Neues Reiseziel angesteuert 비스 WIR..
조나단 미는

1
@Jonathan Mee : 제안에 따라 답을 편집했습니다. 이론적으로 3 개의 백 슬래시로 올바르게 쓰여졌지만, stackoverflow는 인용을 위해 백 슬래시를 사용하고 첫 번째 두 백 슬래시를 하나의 단일 백 슬래시로 변환했습니다
huha

5

JSON에서 큰 따옴표를 이스케이프하려면 \\를 사용하여 이스케이프하십시오.

다음 자바 스크립트 객체의 json을 생성하려는 경우의 예

{time: '7 "o" clock'}

다음과 같이 작성해야합니다

'{"time":"7 \\"o\\" clock"}'

우리가 그것을 사용하여 구문 분석하면 JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

결과는

{time: "7 "o" clock"}

1

JSON 데이터에 문제를 일으키는 백 슬래시를 이스케이프 처리하려면이 함수를 사용합니다.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};

6
프로그래머가 콘텐츠를 제거 (또는 "정화")하는 대신 콘텐츠를 인코딩하도록 권장합니다. 예전에는 데이터베이스 데이터를 "정리"하는 아이디어가있었습니다. 특히 작은 따옴표 ( ')를 제거했습니다. 프로그래머들은 사람들이 자신의 성 (O'Doul)을 사용할 수 없다는 것을 깨닫지 못했습니다. 오늘의 프로그래머가 다른 방법을 사용하여 데이터를 제거하거나 정리하지 않고 원본 콘텐츠를 데이터베이스로 가져 오기를 바랍니다.
DanBaker

좋아, 캐릭터를 제거하기 위해 캐릭터 스트립 부분을 제거했습니다. @ DanBaker는 문자의 텍스트를 제거하는 것이 클라이언트 앱에서 JS를 안전하게 만드는 유일한 방법 일 수 있음을 명심하십시오. Angular는 이러한 이유로 HTML 출력을 기본적으로 삭제합니다.
mbokil

데이터를 살균해야하는 시간이 100 % 있다는 데 동의합니다. 그리고 XSS가 그 중 하나입니다. 지적 해 주셔서 감사합니다.
DanBaker

0

개발자 powershell을 사용하려는 사람들을 위해. 설정에 추가 할 줄은 다음과 같습니다.

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.