Recibiendo este error («JSON.parse: caracteres inesperados») cuando intento analizar un JSON validado cadena. Funciona perfectamente cuando me quite los caracteres que necesitan de escape (style=»width:400px;»). Lo que me estoy perdiendo? Hay una manera única de caracteres de escape antes de utilizar parseJSON?

var $cookieString = '{"youTabItems": { "youTab-001": <p style=\"width:400px;\">Welcome to my test</p>, "youTab-002": "test02Value", "youTab-003": "test03Value" }}';

var $myCookieString = $.parseJSON($cookieString);

logThis($myCookieString);

Actualización

Yo era capaz de conseguir la mayoría de los que trabajan, hasta que empecé a guardar /recuperar de las cookies. Ahora, su corte el contenido después de que el punto y coma…alguna idea sobre esto? Estoy usando 3 funciones que se encuentran en quirsmode.com para las cookies de funcionalidad (que se muestra a continuación).

        function setCookie(name, value, days) { var date, expires; if (days) { date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toGMTString(); } else { expires = ""; } document.cookie = name + "=" + value + expires + "; path=/"; }
function getCookie(name) { var nameEQ = name + "=", ca = document.cookie.split(';'), c, i; for (i = 0; i < ca.length; i++) { c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1, c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } } return null; }
function eraseCookie(name) { setCookie(name, "", -1); }
var cookieObject = {"youTabItems": { "youTab-001": "<p style=\"width:400px;\">Welcome to my test</p>", "youTab-002": "test02Value", "youTab-003": "test03Value" }};
var cookieString = JSON.stringify($cookieVal);
setCookie('youTabItems', cookieString, 28);
InformationsquelleAutor Mark26855 | 2011-08-23

3 Comentarios

  1. 6
    var $cookieString = '{"youTabItems": { "youTab-001": "<p style=\\"width:400px;\\">Welcome to my test</p>", "youTab-002": "test02Value", "youTab-003": "test03Value" }}';
    var $myCookieString = $.parseJSON($cookieString);

    Envolver el html como una cadena para hacer el JSON válido.

    Por qué dos barras diagonales inversas?

    La blackslash es el carácter de escape en cadenas JavaScript. Eso significa que tenemos que escapar de sí mismo para crear una literal blackslash. Y necesitamos una barra invertida literal como carácter de escape en el JSON.

    Ejemplo:

    var json = '{"foo": "\\""}';

    va a crear la cadena

    {"foo": "\""}

    que es válido JSON. Si sólo tuviéramos una barra diagonal inversa, se podría crear

    {"foo": """}

    que no es válido.

    Aviso: Esto sólo es necesario debido a que su JSON está dentro de una cadena de JavaScript. Si usted sirve, por ejemplo, como una respuesta HTTP, entonces sólo se necesita una barra diagonal inversa. Pero lo que sea que use para crear el JSON que se va a escapar de las cotizaciones de forma automática, así que no debería tener que lidiar con eso.

    Actualización

    Un mejor método para almacenar los datos en una cookie sería:

    var cookieObject = {"youTabItems": { "youTab-001": "<p style=\"width:400px;\">Welcome to my test</p>", "youTab-002": "test02Value", "youTab-003": "test03Value" }};
    var cookieString = JSON.stringify(cookieObject);
    • Usted no necesita para escapar de la barra antes de comillas (a menos que usted está escapando de la slahs personaje en sí). Sólo encierra el primer elemento es suficiente.
    • No sólo no es necesario, es un error. El siguiente " será tratado como el final del valor.
    • Bueno, depende. Si en realidad se está creando JSON directamente el texto en JavaScript, la vas a necesitar, de lo contrario, el analizador ver el " como el cierre de ese valor. jsfiddle.net/vSwWg
    • El rey me encontré con esto en la consola. Por favor, véase: jsfiddle.net/NxHKX
    • Ah derecho. Porque es dentro de una cadena de JavaScript…. lo siento 🙂 (+1) de la Omi debe mencionar por qué usted necesita el doble de barras. Porque esto es algo que alguien pueda olvidar fácilmente (al parecer).
    • Pero, de nuevo, no estoy seguro de por qué te gustaría crear una cadena en formato JSON en JavaScript, sólo así se puede analizar en objetos de JavaScript. ¿Por qué no simplemente usar literales en el primer lugar?
    • Sí…. tal vez fue sólo para este ejemplo…
    • Las dobles barras solucionado el problema (junto con las cotizaciones que he quitado por alguna razón, cuando puedo copiar había aquí), pero ¿qué son exactamente el doble de barras haciendo? var $cookieString = ‘{«youTabItems»: { «youTab-001»: «<p style=\\»width:400px;\\»>Bienvenidos a mi prueba</p>», «youTab-002»: «test02Value», «youTab-003»: «test03Value» }}’;
    • Crea un literal de slash en la cadena, que es necesario para trabajar como carácter de escape para el JSON parser (\\" -> \"). Pero como dijo patrick, ¿por qué no crear un objeto directamente? Si va a servir el JSON desde otro lugar (no en JS cadena), sólo se necesita una barra.
    • Kling: Siéntase libre de editar en su explicación para los lectores futuros para salvarlos de la pesca de arrastre de estos comentarios.
    • Bueno, mi mayor problema es que estoy tratando de almacenar el JSON en una cookie. Estoy usando las Cookies plugin de jQuery (code.google.com/p/cookies). Estoy corriendo en problemas cuando el plugin unserializes la cookie. Después de juguetear con ella, me di cuenta de que si me quita los caracteres de escape que iba a funcionar.
    • Si crea un objeto JS y establecer el HTML como cadena (correctamente escapado) y, a continuación, utilizar JSON.stringify, debería funcionar bien: jsfiddle.net/fkling/Yz3DA
    • Marca: he añadido un ejemplo de la técnica de @Felix Kling se refería.

  2. 0

    El primer elemento no está encerrada entre comillas:

    "youTab-001": "<pstyle=\"width: 400px;\">Welcometomytest</p>",
  3. 0
    <p style=\"width:400px;\">Welcome to my test</p>

    es una cadena de valor? a continuación, debe ser citado

Dejar respuesta

Please enter your comment!
Please enter your name here