Según el diagrama de máquina de estado en el sitio web de JSON , solo se permiten caracteres de comillas dobles escapadas, no comillas simples. Los caracteres de comillas simples no necesitan escapar:
Actualización : más información para los interesados:
Douglas Crockford no dice específicamente por qué la especificación JSON no permite comillas simples escapadas dentro de cadenas. Sin embargo, durante su discusión sobre JSON en el Apéndice E de JavaScript: The Good Parts , escribe:
Los objetivos de diseño de JSON eran ser mínimos, portátiles, textuales y un subconjunto de JavaScript. Cuanto menos necesitemos acordar para interoperar, más fácilmente podremos interoperar.
Entonces, tal vez decidió permitir que las cadenas se definan utilizando comillas dobles, ya que esta es una regla menos en la que todas las implementaciones de JSON deben estar de acuerdo. Como resultado, es imposible que un carácter de comillas simples dentro de una cadena termine accidentalmente la cadena, porque, por definición, una cadena solo puede terminarse con un carácter de comillas dobles. Por lo tanto, no es necesario permitir el escape de un carácter de comilla simple en la especificación formal.
Cavar un poco más profundo, Crockford
org.json implementación de JSON para Java es más permisible y
lo hace permitir caracteres de comillas simples:
Los textos producidos por los métodos toString se ajustan estrictamente a las reglas de sintaxis JSON. Los constructores son más indulgentes en los textos que aceptarán:
...
- Las cadenas se pueden citar con '(comilla simple).
Esto lo confirma el código fuente de JSONTokener . El nextString
método acepta caracteres de comillas simples escapadas y los trata como caracteres de comillas dobles:
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;
...
En la parte superior del método hay un comentario informativo:
El formato JSON formal no permite cadenas en comillas simples, pero una implementación puede aceptarlas.
Por lo tanto, algunas implementaciones aceptarán comillas simples, pero no debe confiar en esto. Muchas implementaciones populares son bastante restrictivas a este respecto y rechazarán JSON que contiene cadenas entre comillas simples y / o comillas simples escapadas.
Finalmente, para vincular esto con la pregunta original, jQuery.parseJSON
primero intenta usar el analizador JSON nativo del navegador o una biblioteca cargada como json2.js cuando corresponda (que en una nota al margen es la biblioteca en la que se basa la lógica jQuery si JSON
no está definida) . Por lo tanto, jQuery solo puede ser tan permisivo como esa implementación subyacente:
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 );
},
Hasta donde sé, estas implementaciones solo se adhieren a la especificación JSON oficial y no aceptan comillas simples, por lo tanto, jQuery tampoco.
Any character may be escaped
, esto puede explicar por qué alguna implementación permitiría que se escapen las comillas simples.\'
está escrito todavía no está permitido. Sería bueno si el RFC fuera más explícito en este punto.Si necesita una comilla simple dentro de una cadena, ya que \ 'no está definida por la especificación, use
\u0027
ver http://www.utf8-chartable.de/ para ver todaseditar: disculpe mi mal uso de la palabra backticks en los comentarios. Me refería a la barra invertida. Mi punto aquí es que en el caso de que haya anidado cadenas dentro de otras cadenas, creo que puede ser más útil y legible usar unicode en lugar de muchas barras invertidas para escapar de una comilla simple. Sin embargo, si no está anidado, es realmente más fácil simplemente poner una cita antigua simple.
fuente
var jsonEncodedAsString = <?= json_encode(myEncodedJson) ?>
dondemyEncodedJson
es el resultado de una anteriorjson_encode
que se hará cargo de escapar de su comilla simple, en realidad, lo hará justo cotizaciones de salida algo una gran cadena envuelta entre comillas dobles, por lo que no se escaparon comillas simples, dobles, pero será.Entiendo dónde radica el problema y cuando miro las especificaciones está claro que las comillas simples sin escape deben analizarse correctamente.
Estoy usando la función jQuery.parseJSON de jquery para analizar la cadena JSON pero sigo obteniendo el error de análisis cuando hay una comilla simple en los datos que se preparan con json_encode.
¿Podría ser un error en mi implementación que se ve así (PHP - lado del servidor):
El último paso es que almaceno la cadena codificada JSON en una variable JS:
Si uso "" en lugar de '', todavía arroja un error.
SOLUCIÓN:
Lo único que funcionó para mí fue usar bitmask JSON_HEX_APOS para convertir las comillas simples de esta manera:
¿Hay otra forma de abordar este problema? ¿Mi código está mal o mal escrito?
Gracias
fuente
Cuando envía una cotización simple en una consulta
Cuando obtienes el valor incluyendo una cotización simple
Si desea buscar / insertar el valor que incluye una comilla simple en una consulta
xxx=Replace(empid,"'","''")
fuente
Llama la atención un problema similar usando CakePHP para generar un bloque de script JavaScript usando el nativo de PHP
json_encode
.$contractorCompanies
contiene valores que tienen comillas simples y, como se explicó anteriormente y se espera,json_encode($contractorCompanies)
no se les escapa porque es un JSON válido.Al agregar addlashes () alrededor de la cadena codificada JSON, entonces escapa de las comillas permitiendo que Cake / PHP haga eco del javascript correcto en el navegador. Los errores de JS desaparecen.
fuente
Intenté guardar un objeto JSON de una solicitud XHR en un atributo HTML5 data- *. Probé muchas de las soluciones anteriores sin éxito.
Lo que finalmente terminé haciendo fue reemplazar la comilla simple
'
con su código'
usando una expresión regular después de que el método stringify () llamara de la siguiente manera:fuente
Interesante. ¿Cómo estás generando tu JSON en el servidor? ¿Está utilizando una función de biblioteca (como
json_encode
en PHP), o está creando la cadena JSON a mano?Lo único que me llama la atención es el apóstrofe de escape (
\'
). Como está usando comillas dobles, como debería, no hay necesidad de escapar de comillas simples. No puedo verificar si esa es realmente la causa de su error de jQuery, ya que todavía no he actualizado a la versión 1.4.1.fuente