Jak uniknąć podwójnych cudzysłowów w JSON

306

Próbuję wyświetlić podwójne cudzysłowy, ale pokazuje jeden z ukośników odwrotnych:

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

Podczas renderowania w html pokazuje się jako \"Example text\". Jaka jest właściwa droga?

użytkownik1937021
źródło

Odpowiedzi:

446

Spróbuj tego:

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

(tylko jeden ukośnik odwrotny ( \) przed cudzysłowami).

kamituel
źródło
9
@DWGuru nie ma to nic wspólnego z komentarzami, jest to sekwencja ucieczki opisana na ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Ciągi znaków ), gdzie mówi: All characters may be placed within the quotation marks except for the characters that must be escapeda potem określa:\" represents the quotation mark character (U+0022)
mastazi
Z jakiegoś powodu nie działa to z JSON.parse () w JS.
SacWebDeveloper
32

Kiedy i gdzie użyć \\\"zamiast tego. OK, jeśli jesteś podobny do mnie, poczujesz się tak samo głupio, jak ja, kiedy zdałem sobie sprawę, co robię po znalezieniu tego wątku.

Jeśli tworzysz plik tekstowy / strumień .json i importujesz stamtąd dane, to odpowiedź na główny strumień tylko jednego ukośnika odwrotnego przed podwójnymi cudzysłowami: \"jest tym, którego szukasz.

Jednak jeśli jesteś podobny do mnie i próbujesz uzyskać w3schools.com „Tryit Editor” podwójny cudzysłów w pliku wyjściowym JSON.parse (tekst), to ten, którego szukasz, jest potrójny podwójne cudzysłowy \\\". To dlatego, że budujesz swój tekst wewnątrz HTML <script>bloku, a pierwsze podwójne wkładki odwrotnego ukośnika pojedynczy backslash do zmiennej łańcuchowej następnie następujące backslash cudzysłów wstawia cudzysłów w ciąg tak, że otrzymany ciąg skrypt zawiera \"od standardowa odpowiedź i parser JSON przeanalizuje to jako tylko podwójne cudzysłowy.

<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: ponieważ jest to ciąg tekstowy JavaScript, \\"działałby również podwójny cudzysłów ukośnik odwrotny ; ponieważ cudzysłów nie musi uciec obrębie jednego cytowany np smyczkową '\"'i '"'wyniku w tym samym ciąg JS.

Gregor y
źródło
To rozwiązanie pomaga w wersji Swift budować ciąg, który jest dodawany do argumentów dla JSON POST.
Nick N
18

Pokazuje odwrotny ukośnik, ponieważ unikasz również odwrotnego ukośnika.

Oprócz podwójnych cudzysłowów, musisz również unikać ukośników odwrotnych, jeśli chcesz uwzględnić jeden w ciągu cytowanym w JSON. Jeśli jednak zamierzasz użyć odwrotnego ukośnika w sekwencji ucieczki, oczywiście nie powinieneś go unikać.

Alex Worden
źródło
9

Zauważ, że najczęściej występuje to, gdy treść została „podwójnie zakodowana”, co oznacza, że ​​algorytm kodowania został przypadkowo wywołany dwukrotnie.

Pierwsze wywołanie koduje wartość „text2”:

OD: Heute startet unsere Rundreise „Przykładowy tekst”. Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

DO: Heute startet unsere Rundreise \ "Przykładowy tekst \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Drugie kodowanie konwertuje je ponownie, unikając znaków, które już zostały usunięte:

OD: Heute startet unsere Rundreise \ "Przykładowy tekst \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

DO: Heute startet unsere Rundreise \\\ "Przykładowy tekst \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Jeśli więc jesteś odpowiedzialny za implementację serwera tutaj, sprawdź, czy nie ma dwóch kroków próbujących zakodować tę samą zawartość.

Ben
źródło
6
Uważam, że enkoder również uniknąłby przełącznika awaryjnego, więc myślę, że Twój drugi TO: powinien przeczytać: „Heute startet unsere Rundreise \\\" Przykładowy tekst \\\ ". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Jonathan Mee
1
@Jathanathan Mee: Właśnie zredagowałem odpowiedź zgodnie z twoją sugestią. Został on teoretycznie napisany poprawnie z 3 odwrotnymi ukośnikami, ale
przepełnienie stosu
5

jeśli chcesz uniknąć podwójnego cudzysłowu w JSON, użyj \\, aby uciec.

przykład, jeśli chcesz utworzyć Json następującego obiektu javascript

{time: '7 "o" clock'}

musisz napisać w następujący sposób

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

jeśli przeanalizujemy to za pomocą JSON.parse()

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

wynik będzie

{time: "7 "o" clock"}
manas
źródło
1

Aby uniknąć ukośników odwrotnych, które powodują problemy z danymi JSON, używam tej funkcji.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};
mbokil
źródło
6
Zachęcam programistów do kodowania treści, zamiast usuwania (lub „czyszczenia”) treści. Kiedyś istniał pomysł „czyszczenia” danych z bazy danych - zwłaszcza usuwania pojedynczych cudzysłowów ('). Programiści nie zdawali sobie sprawy, że ludzie nie mogą używać własnego nazwiska (O'Doul). Mam nadzieję, że dzisiejsi programiści używają innych sposobów, aby uzyskać oryginalną zawartość do bazy danych bez usuwania danych ani ich czyszczenia.
DanBaker
Ok usunąłem część do usuwania postaci, aby uspokoić masy. @ DanBaker pamiętaj, że usunięcie tekstu znaków może być jedynym sposobem na zapewnienie bezpieczeństwa JS w aplikacji klienckiej. Angular domyślnie dezynfekuje dane wyjściowe HTML.
mbokil
Zgadzam się, że 100% razy dane muszą zostać zdezynfekowane ... a XSS jest jednym z tych czasów. Dziękuję za wskazanie tego.
DanBaker,
0

Dla tych, którzy chcieliby użyć programisty PowerShell. Oto linie do dodania do pliku 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
źródło