Como escapar de aspas duplas em JSON

306

Estou tentando mostrar aspas duplas, mas mostra uma das barras invertidas:

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

Ao renderizar no html, ele mostra como \"Example text\". Qual é o caminho correto?

user1937021
fonte

Respostas:

446

Tente o seguinte:

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

(apenas uma barra invertida ( \) na frente das aspas).

kamituel
fonte
9
O @DWGuru não tem nada a ver com comentários, é uma sequência de escape conforme descrito em ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Strings) onde diz: All characters may be placed within the quotation marks except for the characters that must be escapede então especifica:\" represents the quotation mark character (U+0022)
mastazi 30/0317
Por alguma razão, isso não funciona com JSON.parse () em JS.
SacWebDeveloper
32

Quando e onde usar \\\". OK, se você é como eu, vai se sentir tão bobo quanto eu quando percebi o que estava fazendo depois que encontrei esse tópico.

Se você estiver criando um arquivo de texto .json / fluxo e importando os dados a partir daí, o fluxo principal responderá apenas uma barra invertida antes das aspas duplas: \"é o que você está procurando.

No entanto, se você é como eu e está tentando fazer com que o "Tryit Editor" do w3schools.com tenha aspas duplas na saída do JSON.parse (texto), o que você está procurando é o triplo aspas duplas de barra invertida \\\". Isso é porque você está construindo sua cadeia de texto dentro de um HTML <script>bloco, e as primeiras inserções duplas barra invertida uma única barra invertida para a variável de cadeia, em seguida, a seguinte citação barra invertida dupla insere o aspas duplas na seqüência para que a cadeia script resultante contém a \"partir de a resposta padrão e o analisador JSON analisarão isso apenas como aspas duplas.

<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: como é uma sequência de texto JavaScript, uma aspas dupla com barra invertida \\"também funcionaria; porque as aspas duplas não precisam ser escapadas em uma única cadeia de caracteres entre aspas, por exemplo, '\"'e '"'resultam na mesma cadeia de caracteres JS.

Gregor y
fonte
Essa solução ajuda na versão Swift a criar uma sequência que é adicionada aos argumentos para um JSON POST.
Nick N
18

Está mostrando a barra invertida porque você também está escapando da barra invertida.

Além das aspas duplas, você também deve escapar das barras invertidas se desejar incluir uma em sua cadeia de caracteres JSON. No entanto, se você pretende usar uma barra invertida em uma sequência de escape, obviamente não deve escapar dela.

Alex Worden
fonte
9

Observe que isso ocorre com mais freqüência quando o conteúdo é "codificado duas vezes", o que significa que o algoritmo de codificação foi acidentalmente chamado duas vezes.

A primeira chamada codificaria o valor "text2":

FROM: Ir para o início de uma revisão "Texto de exemplo". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Ative o startet unsere Rundreise \ "Exemplo de texto \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Uma segunda codificação então a converte novamente, escapando dos caracteres já escapados:

FROM: Ir para o início da pesquisa Rundreise \ "Example text \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

TO: Ative o startet unsere Rundreise \\\ "Texto de exemplo \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Portanto, se você é responsável pela implementação do servidor aqui, verifique se não há duas etapas tentando codificar o mesmo conteúdo.

Ben
fonte
6
Eu acredito que o codificador também iria escapar o interruptor de fuga, então eu acho que a sua segunda TO: deve ler: "Heute startet unsere Rundreise \\\" Exemplo de texto \\\" Jeden Tag wird ein neues Reiseziel angesteuert bis wir..
Jonathan Mee
1
@ Jonathan Mee: Acabei de editar a resposta de acordo com sua sugestão. Foi teoricamente escritas corretamente com 3 barras invertidas, mas stackoverflow também usa barras invertidas para citar e converteu o 1º duas barras invertidas a uma única barra invertida
huha
5

se você quiser escapar de aspas duplas no JSON, use \\ para escapar.

exemplo, se você deseja criar o json do seguinte objeto javascript

{time: '7 "o" clock'}

então você deve escrever da seguinte maneira

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

se a analisarmos usando JSON.parse()

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

resultado será

{time: "7 "o" clock"}
manas
fonte
1

Para escapar barras invertidas que causam problemas nos dados JSON, eu uso esta função.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};
mbokil
fonte
6
Eu incentivaria os programadores a codificar o conteúdo, em vez de remover (ou "limpar") o conteúdo. Costumava haver essa idéia de "limpar" os dados do banco de dados - especialmente remover aspas simples ('). Os programadores não perceberam que as pessoas não poderiam usar seu próprio sobrenome (O'Doul). Espero que os programadores de hoje usem outros meios para inserir o conteúdo original no banco de dados sem remover ou limpar os dados.
DanBaker
Ok, eu removi a parte de decapagem do personagem para apaziguar as massas. O @DanBaker lembre-se de remover o texto dos caracteres pode ser a única maneira de tornar o JS seguro em um aplicativo cliente. Angular limpa a saída HTML por esse motivo, por padrão.
mbokil
Concordo 100%, há momentos em que os dados precisam ser higienizados ... e o XSS é um desses momentos. Obrigado por apontar isso.
DanBaker
0

Para quem gostaria de usar o desenvolvedor do PowerShell. Aqui estão as linhas para adicionar às suas configurações.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
fonte