/ / Bug con Javascript JSON.parse? - javascript, json

Bug con Javascript JSON.parse? - javascript, json

console.log(JSON.parse("{"data":"{"json":"rocks"}"}"));

dà errore (testato su console di Firefox e Chrome) .Si tratta di un bug con JSON.parse? Lo stesso decodifica bene quando testato con PHP.

print_r(json_decode("{"data":"{"json":"rocks"}"}", true));

risposte:

10 per risposta № 1

Questa stringa viene elaborata in modo diverso in PHP e JS, cioè ottieni risultati diversi.

Le uniche sequenze di escape in stringhe tra virgolette singole in PHP sono \ e ". Tutti gli altri sono emessi letteralmente, secondo il documentazione:

Per specificare una virgoletta singola letterale, sfuggirla con una barra rovesciata (). Per specificare un backslash letterale, raddoppialo (\). Tutte le altre istanze di backslash verranno considerate come backslash letterale: ciò significa che le altre sequenze di escape a cui potresti essere abituato, come r o n, verrà generato letteralmente come specificato piuttosto che avere un significato speciale.

D'altra parte in JS, se una stringa contiene una sequenza di escape non valida, il backslash viene scartato (CV significa valore del carattere):

  • Il CV di CharacterEscapeSequence :: NonEscapeCharacter è il CV del NonEscapeCharacter.
  • Il CV di NonEscapeCharacter :: SourceCharacter ma no EscapeCharacter o LineTerminator è il SourceCharacter personaggio stesso.

La citazione potrebbe non essere utile da sola, ma se segui il link e dai un'occhiata alla grammatica, dovrebbe essere chiaro.


Quindi in PHP la stringa letteralmente contiene " mentre in JS contiene solo ", che lo rende JSON non valido:

{"data":"{"json":"rocks"}"}

Se vuoi creare una barra rovesciata letterale in JS, devi sfuggirla:

"{"data":"{\"json\":\"rocks\"}"}"

4 per risposta № 2

Per avere letteralmente una barra rovesciata in una stringa letterale, è necessario \.

console.log(JSON.parse("{"data":"{\"json\":\"rocks\"}"}"));

Questo eviterà correttamente le virgolette interne per l'elaborazione JSON.


3 per risposta № 3

Hai bisogno di scappare dai backslash:

console.log(JSON.parse("{"data":"{\"json\":\"rocks\"}"}"));​

1 per risposta № 4

Non hai davvero bisogno di sfuggire alle doppie virgolette tra virgolette singole e hai due citazioni in più nel tuo input intorno all'oggetto interno, solo

console.log(JSON.parse("{"data":{"json":"rocks"}}"));

è abbastanza.


0 per risposta № 5

oggetto con singolo "" non passerò in rassegna JSON.parser

myobj = {"json": "rocks"}

myobj = {\ "json \": \ "rocks \"}

Le linee di Fallowing hanno funzionato per me

rimuovere la barra posteriore

while(typeof myobj == "string"){
myobj = JSON.parse(myobj)
}