Secondo il diagramma della macchina a stati sul sito Web JSON , sono consentiti solo caratteri a virgoletta doppia con escape, non virgolette singole. I caratteri a virgoletta singola non devono essere sottoposti a escape:
Aggiornamento - Ulteriori informazioni per coloro che sono interessati:
Douglas Crockford non specifica specificamente perché la specifica JSON non consente virgolette singole con escape nelle stringhe. Tuttavia, durante la sua discussione su JSON nell'Appendice E di JavaScript: The Good Parts , scrive:
Gli obiettivi di progettazione di JSON dovevano essere minimi, portatili, testuali e un sottoinsieme di JavaScript. Meno dobbiamo concordare per interagire, più facilmente possiamo interagire.
Quindi forse ha deciso di consentire la definizione delle stringhe usando solo virgolette poiché questa è una regola in meno su cui tutte le implementazioni JSON devono concordare. Di conseguenza, è impossibile che un singolo carattere tra virgolette all'interno di una stringa termini accidentalmente la stringa, poiché per definizione una stringa può essere terminata solo da un carattere tra virgolette doppie. Quindi non è necessario consentire l'escaping di un singolo carattere di virgoletta nella specifica formale.
Scavando un po 'più profondo, di Crockford
org.json realizzazione di JSON per Java è più ammissibile e
non consentire singoli caratteri di citazione:
I testi prodotti con i metodi toString sono rigorosamente conformi alle regole di sintassi JSON. I costruttori sono più indulgenti nei testi che accetteranno:
...
- Le stringhe possono essere citate con '(virgoletta singola).
Ciò è confermato dal codice sorgente JSONTokener . Il nextString
metodo accetta caratteri di virgoletta singola con escape e li tratta come caratteri di virgoletta doppia:
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
Nella parte superiore del metodo è presente un commento informativo:
Il formato JSON formale non consente le stringhe tra virgolette singole, ma è consentita un'implementazione per accettarle.
Quindi alcune implementazioni accettano virgolette singole, ma non dovresti fare affidamento su questo. Molte implementazioni popolari sono piuttosto restrittive in questo senso e rifiuteranno JSON che contiene stringhe tra virgolette singole e / o virgolette singole con escape.
Infine, per ricollegarlo alla domanda originale, jQuery.parseJSON
prima tenta di utilizzare il parser JSON nativo del browser o una libreria caricata come json2.js ove applicabile (che su una nota a margine è la libreria su cui si basa la logica jQuery se JSON
non è definita) . Quindi jQuery può essere permissivo solo come l'implementazione sottostante:
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
Per quanto ne so, queste implementazioni aderiscono solo alla specifica JSON ufficiale e non accettano virgolette singole, quindi nemmeno jQuery.