Cách thoát dấu ngoặc kép trong JSON


306

Tôi đang cố gắng hiển thị dấu ngoặc kép nhưng nó hiển thị một trong các dấu gạch chéo ngược:

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

Khi kết xuất trong html nó hiển thị như \"Example text\". Cách chính xác là gì?

Câu trả lời:


446

Thử cái này:

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

(chỉ một dấu gạch chéo ngược ( \) ở phía trước dấu ngoặc kép).


9
@DWGuru điều này không liên quan gì đến bình luận, đó là một lối thoát như được mô tả tại ecma-i Intl.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - String) trong đó nói: All characters may be placed within the quotation marks except for the characters that must be escapedvà sau đó chỉ định:\" represents the quotation mark character (U+0022)
mastazi

Vì một số lý do, điều này không hoạt động với JSON.parse () trong JS.
SacWebDeveloper

32

Khi nào và ở đâu để sử dụng \\\"thay thế. OK nếu bạn giống như tôi, bạn sẽ cảm thấy ngớ ngẩn như tôi đã làm khi tôi nhận ra những gì tôi đã làm sau khi tôi tìm thấy chủ đề này.

Nếu bạn đang tạo tệp / luồng văn bản .json và nhập dữ liệu từ đó thì câu trả lời của luồng chính chỉ là một dấu gạch chéo ngược trước dấu ngoặc kép: \"là câu bạn đang tìm kiếm.

Tuy nhiên, nếu bạn giống như tôi và bạn đang cố gắng để "Trình soạn thảo thử" của w3schools.com có ​​một dấu ngoặc kép trong đầu ra của JSON.parse (văn bản), thì cái bạn đang tìm kiếm là bộ ba dấu gạch chéo kép \\\". Điều này là do bạn đang xây dựng chuỗi văn bản của mình trong một <script>khối HTML và dấu gạch chéo kép đầu tiên chèn một dấu gạch chéo ngược vào biến chuỗi sau đó trích dẫn dấu gạch chéo ngược sau sẽ chèn trích dẫn kép vào chuỗi sao cho chuỗi tập lệnh kết quả chứa \"từ câu trả lời chuẩn và trình phân tích cú pháp JSON sẽ phân tích điều này như chỉ là dấu ngoặc kép.

<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: vì đó là một chuỗi văn bản JavaScript, một trích dẫn kép dấu gạch chéo kép \\"cũng sẽ hoạt động; bởi vì trích dẫn kép không cần thoát trong một chuỗi được trích dẫn, ví dụ '\"''"'dẫn đến cùng một chuỗi JS.


Giải pháp này giúp trong phiên bản Swift xây dựng chuỗi được thêm vào đối số cho POST POST.
Nick N

18

Nó hiển thị dấu gạch chéo ngược vì bạn cũng đang thoát dấu gạch chéo ngược.

Ngoài dấu ngoặc kép, bạn cũng phải thoát dấu gạch chéo ngược nếu bạn muốn bao gồm một dấu ngoặc kép trong chuỗi trích dẫn JSON của mình. Tuy nhiên, nếu bạn có ý định sử dụng dấu gạch chéo ngược trong chuỗi thoát, rõ ràng bạn không nên thoát nó.


9

Lưu ý rằng điều này thường xảy ra khi nội dung đã được "mã hóa kép", có nghĩa là thuật toán mã hóa đã vô tình được gọi hai lần.

Cuộc gọi đầu tiên sẽ mã hóa giá trị "text2":

TỪ: Heute startet unere Rundreise "Ví dụ văn bản". Jiza Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Heute startet unere Rundreise \ "Ví dụ văn bản \". Jiza Tag wird ein neues Reiseziel angesteuert bis wir.

Một mã hóa thứ hai sau đó chuyển đổi nó một lần nữa, thoát khỏi các ký tự đã thoát:

TỪ: Heute startet unere Rundreise \ "Ví dụ văn bản \". Jiza Tag wird ein neues Reiseziel angesteuert bis wir.

ĐẾN: Heute startet unere Rundreise \\\ "Ví dụ văn bản \\\". Jiza Tag wird ein neues Reiseziel angesteuert bis wir.

Vì vậy, nếu bạn chịu trách nhiệm triển khai máy chủ tại đây, hãy kiểm tra để đảm bảo không có hai bước cố gắng mã hóa cùng một nội dung.


6
Tôi tin rằng bộ mã hóa cũng sẽ thoát khỏi switch thoát vì vậy tôi nghĩ thứ hai của bạn TO: nên đọc: "heute startet unsere Rundreise \\\" Ví dụ văn bản \\\" Jeden Tag wird ein Neues Reiseziel angesteuert bis wir..
Jonathan Mee

1
@Jonathan Mee: Chỉ cần chỉnh sửa câu trả lời theo đề nghị của bạn. Về mặt lý thuyết nó được viết chính xác với 3 dấu gạch chéo ngược, nhưng stackoverflow cũng sử dụng dấu gạch chéo ngược để trích dẫn và chuyển đổi hai dấu gạch chéo đầu tiên thành một dấu gạch chéo ngược
huha

5

nếu bạn muốn thoát dấu ngoặc kép trong JSON, hãy sử dụng \\ để thoát nó.

ví dụ nếu bạn muốn tạo json của đối tượng javascript sau

{time: '7 "o" clock'}

sau đó bạn phải viết theo cách sau

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

nếu chúng ta phân tích nó bằng cách sử dụng JSON.parse()

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

kết quả sẽ là

{time: "7 "o" clock"}

1

Để thoát dấu gạch chéo ngược gây ra sự cố cho dữ liệu JSON, tôi sử dụng chức năng này.

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

6
Tôi sẽ khuyến khích các lập trình viên mã hóa nội dung, thay vì xóa (hoặc "làm sạch") nội dung. Đã từng có ý tưởng về việc "làm sạch" dữ liệu cơ sở dữ liệu - đặc biệt là xóa các dấu ngoặc đơn ('). Các lập trình viên không nhận ra mọi người không thể sử dụng họ của họ (O'Doul). Tôi hy vọng các lập trình viên ngày nay sử dụng các phương tiện khác để đưa nội dung gốc vào cơ sở dữ liệu mà không tước hoặc xóa dữ liệu.
DanBaker

Ok tôi đã loại bỏ phần nhân vật tước để xoa dịu quần chúng. @DanBaker hãy ghi nhớ tước văn bản của các ký tự có thể là cách duy nhất để làm cho JS an toàn trong ứng dụng khách. Angular vệ sinh đầu ra HTML vì lý do này theo mặc định.
mbokil

Tôi đồng ý 100% có những lúc dữ liệu phải được vệ sinh ... và XSS là một trong những lần đó. Cảm ơn bạn đã chỉ ra rằng một trong những.
DanBaker

0

Đối với những người muốn sử dụng powershell nhà phát triển. Dưới đây là các dòng để thêm vào settings.json của bạn:

"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} ",
    ],
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.