Как избежать двойных кавычек в 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\". Какой правильный путь?

user1937021
источник

Ответы:

446

Попробуй это:

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

(только одна обратная косая черта ( \) перед кавычками).

kamituel
источник
9
@DWGuru это не имеет ничего общего с комментариями, это escape-последовательность, как описано в 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. Однако, если вы намереваетесь использовать обратную косую черту в escape-последовательности, очевидно, вы не должны избегать ее.

Алекс Уорден
источник
9

Обратите внимание, что это чаще всего происходит, когда контент был «дважды закодирован», то есть алгоритм кодирования был случайно вызван дважды.

Первый вызов закодирует значение «text2»:

ОТ: Heute Startet Unsere Rundreise "Пример текста". Jeden Tag Wird Ein Neues Reiseziel angesteuert bis wir.

TO: 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.

TO: 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
@ Джонатан Ми: Просто отредактировал ответ в соответствии с вашим предложением. Это было теоретически написано правильно с 3-
мя обратными слешами
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,'\\');
};
mbokil
источник
6
Я бы посоветовал программистам кодировать контент, а не удалять (или «очищать») контент. Раньше существовала идея «очистки» данных базы данных - особенно удаления одинарных кавычек ('). Программисты не понимали, что люди не могут использовать свою фамилию (О'Доул). Я надеюсь, что современные программисты используют другие средства для добавления исходного контента в базу данных без очистки или очистки данных.
DanBaker
Хорошо, я удалил часть для удаления символов, чтобы успокоить массы. @DanBaker помните, что удаление текста из символов может быть единственным способом обеспечения безопасности JS в клиентском приложении. По этой причине Angular очищает вывод HTML по умолчанию.
Мбокил
Я согласен на 100%, что бывают случаи, когда данные необходимо очищать ... и XSS - один из таких случаев. Спасибо, что указали на это.
DanBaker
0

Для тех, кто хотел бы использовать разработчика powershell. Вот строки, которые нужно добавить в ваш файл 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} ",
    ],
erikeah
источник