Як уникнути подвійних цитат у 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)
мастазі

Чомусь це не працює з JSON.parse () в JS.
SacWebDeveloper

32

Коли і де використовувати \\\" замість цього. Гаразд, якщо ти схожий на мене, ти почуватимешся так само нерозумно, як і я, коли зрозумів, що роблю після того, як знайшов цю тему.

Якщо ви створюєте текстовий файл / потік .json та імпортуєте дані звідти, то основний потік відповідає лише на одну зворотну косу рису перед подвійними лапками:\" це той, який ви шукаєте.

Однак якщо ти схожий на мене, і ти намагаєшся отримати "w3schools.com" Tryit Editor ", щоб у виводі JSON.parse (текст) були подвійні лапки (текст), то те, що ти шукаєш, є потрійним зворотні подвійні котирування \\\". Це тому , що ви будуєте свій текстовий рядок всередині HTML <script>блоку, і перші подвійні вставки зворотної косої один зворотний слеш в строкову змінну , то наступний зворотний слеш подвійні лапки вставляє подвійні лапки в рядок , так що результуюча рядок сценарію містить \"від стандартна відповідь і аналізатор 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.
Нік N

18

Він показує зворотну косу рису, тому що ви також уникаєте нахилу.

Крім подвійних лапок, ви також повинні уникати зворотних нахилів, якщо ви хочете включити його в рядок, котируваний JSON. Однак якщо ви маєте намір використовувати зворотну косу рису в послідовності втечі, очевидно, вам не слід уникати цього.


9

Зауважте, що це найчастіше відбувається, коли вміст було "подвійно закодовано", тобто алгоритм кодування випадково викликався двічі.

Перший виклик кодує значення "text2":

ВІД: Heute startet unsere Rundreise "Приклад тексту". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

ДО: Heute startet unsere Rundreise \ "Приклад тексту \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Потім друге кодування потім перетворює його знову, уникаючи вже уникнутих символів:

ВІД: Heute startet unsere Rundreise \ "Приклад тексту \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

ДО: Heute startet unsere Rundreise \\\ "Приклад тексту \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Отже, якщо ви несете відповідальність за впровадження тут сервера, переконайтеся, що немає двох кроків, які намагаються кодувати один і той же вміст.


6
Я вважаю, що кодер також уникне вимикача, тому я думаю, що ваш другий TO: повинен прочитати: "Heute startet unsere Rundreise \\" "Приклад тексту \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Джонатан Мей

1
@Jonathan Mee: Щойно відредагував відповідь відповідно до вашої пропозиції. Теоретично це було написано правильно з 3-х зворотними косою рисою, але stackoverflow також використовує зворотні косої риски для цитування та перетворив 1-й два косих косих риси в один єдиний
нахил

5

якщо ви хочете уникнути подвійної цитати в JSON, використовуйте \\, щоб уникнути цього.

Наприклад, якщо ви хочете створити json з наступного об’єкта javascript

{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 безпечним у клієнтському додатку. З цієї причини за замовчуванням кутовий дезінфікує вихід HTML.
mbokil

Я погоджуюся, що на 100% трапляються випадки, коли дані підлягають санітарній обробці ... і XSS - це один із таких часів. Дякую, що вказали на це.
DanBaker

0

Для тих, хто хотів би скористатися повноваженнями для розробників. Ось рядки, які потрібно додати до свого settings.json:

"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} ",
    ],
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.