Pergunta

A aspas mesmo se escapou é jogando erro de análise.
olhada no código abaixo

//parse the json in javascript  
var testJson = '{"result": ["lunch", "\"Show\""] }';  
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

Este está jogando um erro de interpretação por causa das aspas duplas (que já estão escaparam).
Mesmo eval() não vai funcionar aqui.
Mas se eu escapar com barras duplas como este:

var result = '{"result": ["lunch", "\\"Show\\""] }';  
var tags = JSON.parse(result);  
alert (tags.result[1]);

, em seguida, ele funciona bem.
Por que precisamos usar barras duplas aqui em javascript? O problema é que a função PHP json_encode() escapa uma citação duplo com uma única barra (como este: \"show\") que JSON.parse não vai ser capaz de analisar. Como faço para lidar com esta situação?

Foi útil?

Solução

Bem, finalmente, de análise de JSON usa o mesmo eval, por isso não há diferença quando você lhes dá smth. com sintaxe incorreta. Neste caso, você tem que escapar corretamente suas cotações em PHP, e em seguida, fugir deles e suas barras escapando com json_encode

<?php
    $json = '{"result": ["lunch", "\"Show\""] }';
    echo json_encode($json);
?>

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"

Isso deve funcionar em JS do lado do cliente (se eu fiz há erros de digitação).

Outras dicas

Javascript não escapa suas cordas e JSON não escapa-los também. a primeira cadeia ('{"result": ["lunch", "\"Show\""] }') é vista pelo analisador como json {"result": ["lunch", ""Show""] }, porque \" no meio javascript ", mas não sair da cadeia entre aspas dupla.

O segundo '{"result": ["lunch", "\\\"Show\\\""] }' corda recebe primeiro unescaped para {"result": ["lunch", "\"Show\""] } (e que está corretamente unescaped por JSON).

eu acho, que '{"result": ["lunch", "\\"Show\\""] }' deve funcionar também.

Este problema é causado pela cadeia de dois dobrado mecanismo de fuga:. Um vem de um JS e vem de JSON

Uma combinação do carácter barra invertida combinada com outra sequência de caracteres é usado para representar um carácter que não é de outro modo representável no interior da cadeia. '' \\ '' significa '\' etc.

Este mecanismo de fuga ocorre antes JSON.parse () funciona.

Por exemplo,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"

Do ponto de vista do gerador de string, ele passa quatro folgas '\' no interpretor JavaScript.

Do ponto de vista do intérprete JavaScript, ele inteprets há dois retrocessos (\) como cada seqüência '\\' será interpretada como um '\'.

Do ponto de vista do parser JSON, ele recebe duas folgas (\\) e as regras de escape string JSON vai analisa-lo como um único '\' que é o resultado de saída.

Explique que você primeiro código:

var testJson = '{"result": ["lunch", "\"Show\""] }';
//The real string after sequence escaping in to JS is
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse.
//Thus, it breaks the JSON grammar and generates an error
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

A partir da docs

JSON_HEX_APOS (inteiro) All 'são convertidos para \ u0027
JSON_HEX_QUOT (inteiro) All "são convertidos para \ u0022

json_encode () leva dois argumentos, o valor e as opções. Portanto, tente

json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);

Eu não tentei isso, porém.

Desligue magic_quotes_gpc em php.ini .

php para javascript Object (PHP> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');

Se as fugas padrão C são adicionados, em seguida, irá converter JSON.parse sequências como \" em ", \\ em \, \n em uma linha de alimentação, etc.

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

No caso do nosso projeto:

originais ""{\"lat\":28.4594965,\"lng\":77.0266383}"" corda

Depois de passar a JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

Em 2 nd passar para JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Observe que JSON.parse() removido escapar caracteres em vez de converter string para object.

Depois que os personagens que escapam foram removidos, a string a conversão objeto trabalhado.

Aqui está a demo:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

Isto pode ajudar:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top