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.
Any character may be escaped
, isso pode explicar por que alguns implementação permitiria aspas simples para ser escapado.\'
ainda não é permitido o escape de uma única citação conforme escrita . Seria bom se o RFC fosse mais explícito nesse ponto.Se você precisa de uma aspa simples dentro de uma string, uma vez que \' é indefinido pela especificação, o uso
\u0027
ver http://www.utf8-chartable.de/ para todos elesedit: desculpe meu uso indevido da palavra backticks nos comentários. Eu quis dizer barra invertida. Meu argumento aqui é que, no caso de você ter aninhado cadeias dentro de outras cadeias, acho que pode ser mais útil e legível usar unicode em vez de muitas barras invertidas para escapar de uma única citação. Se você não estiver aninhado, no entanto, é realmente mais fácil colocar uma citação simples e antiga.
fonte
var jsonEncodedAsString = <?= json_encode(myEncodedJson) ?>
aí quemyEncodedJson
está o resultado de um anterior.json_encode
Isso resolverá o escape de sua aspas simples, na verdade, apenas produzirá algo em uma grande string envolta em aspas duplas, para que aspas simples não sejam escapadas, mas aspas duplas vai.Entendo onde está o problema e, quando olho as especificações, fica claro que aspas simples sem escape devem ser analisadas corretamente.
Estou usando a função jQuery.parseJSON do jquery para analisar a string JSON, mas ainda obtendo o erro de análise quando há uma única citação nos dados preparados com json_encode.
Poderia ser um erro na minha implementação que se parece com isso (PHP - lado do servidor):
A etapa final é que eu armazene a string codificada em JSON em uma variável JS:
Se eu usar "" em vez de '', ele ainda gera um erro.
SOLUÇÃO:
A única coisa que funcionou para mim foi usar a máscara de bit JSON_HEX_APOS para converter aspas simples assim:
Existe outra maneira de resolver esse problema? Meu código está errado ou está mal escrito?
obrigado
fonte
Quando você está enviando uma aspas simples em uma consulta
Quando você obtém o valor, incluindo uma única citação
Se você deseja pesquisar / inserir o valor que inclui uma aspas simples em uma consulta
xxx=Replace(empid,"'","''")
fonte
Ocorreu um problema semelhante usando o CakePHP para gerar um bloco de script JavaScript usando o nativo do PHP
json_encode
.$contractorCompanies
contém valores que possuem aspas simples e, como explicado acima e o esperadojson_encode($contractorCompanies)
, não os escapam porque seu JSON válido.Adicionando addlashes () ao redor da string codificada em JSON, você escapa as aspas, permitindo que o Cake / PHP faça eco do javascript correto no navegador. Os erros do JS desaparecem.
fonte
Eu estava tentando salvar um objeto JSON de uma solicitação XHR em um atributo data- * HTML5. Eu tentei muitas das soluções acima sem sucesso.
O que finalmente acabei fazendo foi substituir a aspas simples
'
pelo código'
usando um regex após o método stringify () chamar da seguinte maneira:fonte
Interessante. Como você está gerando seu JSON no servidor final? Você está usando uma função de biblioteca (como
json_encode
no PHP) ou está construindo a string JSON manualmente?A única coisa que chama minha atenção é o apóstrofo da fuga (
\'
). Como você está usando aspas duplas, como realmente deveria, não há necessidade de escapar de aspas simples. Não consigo verificar se essa é realmente a causa do seu erro do jQuery, pois ainda não atualizei para a versão 1.4.1.fonte