Domanda

Una doppia citazione anche se sfuggito sta gettando errore di analisi.
guardare il codice seguente

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

Questo sta gettando errore di analisi a causa delle virgolette (che sono già sfuggito).
Anche eval() non funziona qui.
Ma se scappo con doppie barre come questo:

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

allora funziona benissimo.
Perché abbiamo bisogno di utilizzare una doppia barra qui in javascript? Il problema è che la funzione PHP json_encode() sfugge un doppio apice con una singola barra (come questo: \"show\"), che JSON.parse non sarà in grado di analizzare. Come faccio a gestire questa situazione?

È stato utile?

Soluzione

Bene, finalmente, parse di JSON utilizza lo stesso eval, quindi non c'è differenza quando si dà loro smth. con la sintassi non corretta. In questo caso è necessario sfuggire correttamente le citazioni in php, per poi fuggire e la loro fuga barre con json_encode

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

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

Questo dovrebbe funzionare su JS lato client (se ho fatto errori di battitura).

Altri suggerimenti

JavaScript sequenza non di escape sue corde e JSON loro sequenza non di escape pure. la prima stringa ('{"result": ["lunch", "\"Show\""] }') è visto dal parser JSON come {"result": ["lunch", ""Show""] }, perché \" in javascript significa ", ma non esce la stringa doppia citato.

Il secondo '{"result": ["lunch", "\\\"Show\\\""] }' stringa viene prima escape a {"result": ["lunch", "\"Show\""] } (e che sia correttamente escape da json).

Credo che '{"result": ["lunch", "\\"Show\\""] }' dovrebbe funzionare anche.

Questo problema è causato dal meccanismo di fuga due piegato stringa: uno proviene da JS e uno proviene da JSON

.

Una combinazione del carattere rovesciato combinata con un'altra di carattere viene utilizzato per rappresentare un carattere che non sia altrimenti rappresentabile all'interno della stringa. '' \\ '' sta per '\' ecc

Questo meccanismo fuggire avviene prima JSON.parse () funziona.

Ad esempio,

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

Dal punto di vista del generatore di stringa, passa quattro contraccolpi '\' nel interprete JavaScript.

Dal punto di vista interprete JavaScript, esso inteprets ci sono due contraccolpi (\) come ogni '\\' sequenza sarà interpretato come una '\'.

Dalla prospettiva del parser JSON, è riceve due contraccolpi (\\) e le regole di escape stringa JSON si analizza come un'unica '\' che è il risultato di uscita.

spiegare primo codice:

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]);

docs

  

JSON_HEX_APOS (intero) All 'vengono convertiti in \ u0027
  JSON_HEX_QUOT (intero) All "vengono convertiti in \ u0022

json_encode () prende due args, il valore e le opzioni. Quindi, cercare

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

Non ho provato questo, però.

Disattiva magic_quotes_gpc in php.ini .

php per JavaScript Object (php> = 5.3.0)

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

Se si aggiungono le uscite C standard, quindi JSON.parse convertirà sequenze come \" in ", \\ in \, \n in una linea di alimentazione, ecc.

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

Nel caso di nostro progetto:

originale ""{\"lat\":28.4594965,\"lng\":77.0266383}"" stringa

Dopo il passaggio a JSON.parse()

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

2 nd passaggio a JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Si noti che JSON.parse() rimosso sfuggire caratteri invece di convertire string a object.

Dopo i caratteri fuga sono stati rimossi, la stringa di opporsi conversione lavorato.

Ecco la demo:

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

Questo potrebbe aiutare:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top