De acordo com o diagrama da máquina de estado no site JSON , apenas caracteres de aspas duplas escapados são permitidos, não aspas simples. Os caracteres de aspas simples não precisam ser escapados:
Atualização - Mais informações para aqueles que estão interessados:
Douglas Crockford não diz especificamente por que a especificação JSON não permite aspas simples escapadas dentro de strings. No entanto, durante sua discussão sobre JSON no Apêndice E do JavaScript: The Good Parts , ele escreve:
Os objetivos de design do JSON eram mínimos, portáteis, textuais e um subconjunto de JavaScript. Quanto menos precisamos concordar para interoperar, mais facilmente podemos interoperar.
Portanto, talvez ele tenha decidido permitir apenas que cadeias sejam definidas usando aspas duplas, pois essa é uma regra a menos com a qual todas as implementações JSON devem concordar. Como resultado, é impossível que um caractere de aspas simples dentro de uma string termine acidentalmente a string, porque, por definição, uma string só pode ser terminada por um caractere de aspas duplas. Portanto, não há necessidade de permitir o escape de um caractere de aspas simples na especificação formal.
Indo um pouco mais profundo, do Crockford
org.json implementação de JSON para Java é mais admissível e
faz permitir caracteres de aspas simples:
Os textos produzidos pelos métodos toString estão em conformidade estrita com as regras de sintaxe JSON. Os construtores são mais tolerantes nos textos que aceitarão:
...
- As strings podem ser citadas com '(aspas simples).
Isso é confirmado pelo código-fonte JSONTokener . O nextString
método aceita caracteres de aspas simples escapados e os trata como caracteres de aspas duplas:
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;
...
No topo do método, há um comentário informativo:
O formato JSON formal não permite seqüências de caracteres entre aspas simples, mas uma implementação pode aceitá-las.
Portanto, algumas implementações aceitarão aspas simples - mas você não deve confiar nisso. Muitas implementações populares são bastante restritivas nesse sentido e rejeitarão o JSON que contém seqüências de caracteres entre aspas simples e / ou aspas simples escapadas.
Finalmente, para vincular isso à pergunta original, jQuery.parseJSON
primeiro tente usar o analisador JSON nativo do navegador ou uma biblioteca carregada, como json2.js, quando aplicável (que em uma nota lateral é a biblioteca na qual a lógica do jQuery se baseia se JSON
não estiver definida) . Portanto, o jQuery pode ser tão permissivo quanto a implementação subjacente:
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 );
},
Tanto quanto sei, essas implementações seguem apenas a especificação JSON oficial e não aceitam aspas simples, portanto, o jQuery também não.