2009-03-10 22 views
15

he tratado de analizar la siguiente respuesta JSON tanto con el jQuery y Ajax getJSON:jQuery getJSON - ParseError ajax

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}] 

También he intentado escapar los caracteres "/" como esto:

[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview <\/h1><h1>January 29, 2009<\/h1>"}] 

Cuando uso el getJSON, la dosis no ejecuta la devolución de llamada. Por lo tanto, he probado con jQuery Ajax de la siguiente manera:

$.ajax({ 
    url: jURL, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    beforeSend: function(x) { 
     if(x && x.overrideMimeType) { 
      x.overrideMimeType("application/j-son;charset=UTF-8"); 
     } 
    }, 
    success: function(data){ 
     wId = data.iId; 
     $("#txtHeading").val(data.heading); 
     $("#txtBody").val(data.body); 
     $("#add").slideUp("slow"); 
     $("#edit").slideDown("slow"); 
    },//success 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown); 
    } 
}); 

El Ajax golpea el error ans alertas lo siguiente:

XMLHttpRequest=[{"iId":"1","heading":"Management Services","body":"<h1>Program Overview </h1><h1>January 29, 2009</h1>"}] 

textStatus=parseerror 

errorThrown=undefined 

Luego probé un simple jQuery Lo llaman para devolver el JSON utilizando la siguiente código:

$.get(jURL,function(data){ 
    var json = eval("("+data+");"); 
    wId = json.iId; 
    $("#txtHeading").val(json.heading); 
    $("#txtBody").val(json.body); 
    $("#add").slideUp("slow"); 
    $("#edit").slideDown("slow"); 
}) 

el .get devuelve el JSON, pero la eval viene con errores no importa lo he modificado el JSON (encabezado de tipo de contenido, otras variaciones del formato, etc.)

Lo que se me ocurre es que parece que hay un problema al devolver el HTML en el JSON y hacer que se analice. Sin embargo, tengo la esperanza de haber perdido algo que me permita obtener esta información a través de JSON. ¿Alguien tiene alguna idea?

+0

¿Eso es todo el JSON devuelto? –

+0

Se corrigió el formateo. en el futuro solo sangría con el código de 4 espacios y ya está listo para comenzar. –

+0

Sí, eso es todo el JSON devuelto. Solo trato de devolver un solo artículo con 3 valores (id, título, cuerpo) de la base de datos (para que los usuarios puedan actualizarlo). No sería un documento HTML completo devuelto. Justo lo que necesito mostrar en un div. ¡Gracias por el formateo! –

Respuesta

1

¿Ha intentado con la codificación XML del HTML (es decir, & lt; H1 & gt;)?

+0

Acabo de probarlo, y todavía tengo el parseerror. –

1

Usted podría tener que volver en forma de texto y luego analizar con el json.org parser
Para ver si funciona de forma diferente

0

En primer lugar, tratar de determinar si el problema es con JSON general de codificación/decodificación. intente objetos más simples, con números y cadenas simples, luego con HTML entre comillas.

Después de que funcione JSON, realmente debería considerar eliminar el HTML de allí. Mucho mejor es mover solo los datos y dejar los detalles de la presentación en las plantillas. Al usar AJAX, eso significa una plantilla oculta en el HTML, y usa jQuery para replicarlo y completarlo con los datos. revise cualquiera de los jQuery template plugins. De estos, jTemplates es un favorito común.

+0

Funciona bien hasta que agregue el HTML ... pero son solo un par de etiquetas H1. He intentado sacarlos de varias maneras, pero nada parece arreglarlo. –

+0

¿Podría ser su servidor el que manipula el JSON cuando encuentra HTML? – Javier

0

Creo que está haciendo una pregunta incorrecta. Usar $ .getJSON() es mucho más fácil, y si tienes problemas con él, sería mejor pedir $ .getJSON() que para $ .ajax(). También puede ser útil mirar el código fuente de la función getJSON, porque veo que aquí tienes muchas cosas inútiles con mimeTypes. Ese no es el camino.

0

El valor que está tratando de analizar está entre corchetes [], lo que significa que es una matriz. Estás tratando de evaluar una matriz. Trate de eval el primer elemento de la matriz, y debería funcionar ...

var json = eval("("+data[0]+");"); 

Además, yo recomendaría el uso de la JSON.parse() proporcionado here lugar de llamar a eval() directamente.

+0

Esto parece prometedor. Ahora pasa el eval(), pero el json var se muestra como indefinido. –

7

La cadena JSON que tiene es una matriz con 1 objeto dentro de ella, por lo que para acceder al objeto primero debe acceder a la matriz. Con un json.php que tiene este aspecto:

[ 
    { 
     "iId": "1", 
     "heading": "Management Services", 
     "body": "<h1>Program Overview</h1><h1>January 29, 2009</h1>" 
    } 
] 

simplemente probé este

$.getJSON("json.php", function(json) { 
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1> 
    alert(json[0].heading); // "Management Services" 
    alert(json[0].iId); // "1" 
}); 

También probé esto:

$.get("json.php", function(data){ 
    json = eval(data); 
    alert(json[0].body); // <h1>Program Overview</h1><h1>January 29, 2009</h1> 
    alert(json[0].heading); // "Management Services" 
    alert(json[0].iId); // "1" 
}); 

Y ambos trabajaron bien para mí.

+0

La mía nunca parece devolver el éxito. Entonces, no puedo hacer que ejecute la función. Sin embargo, esto se está desarrollando para alguien que es un usuario de IE. Entonces, he estado probando en IE. Lo intentaré en Firefox lo antes posible, pero (lamentablemente) tiene que funcionar en IE. –

+0

Corrí el código anterior tanto en IE como en Firefox y está volviendo bien. Intenta ejecutar lo que tengo arriba y comienza a agregar elementos desde allí. –

+0

vamos a probarlo ahora. Empecé a renunciar al JSON. –

1

Tenga en cuenta que en la pregunta hay un error de sintaxis. La línea con

x.overrideMimeType("application/j-son;charset=UTF-8"); 

debe leer

x.overrideMimeType("application/json; charset=UTF-8"); 

Esto hace una gran diferencia también.

1

Quite el [], en el frente y el último en JsonData, y funciona.

+0

JSLint dirá que tener JSON comenzando con una Matriz [] es válido, ¿me equivoco? – Pierre

3

Si alguien todavía tiene problemas con esto, es porque su respuesta debe ser una cadena JSON y un tipo de contenido "application/json".

Ejemplo de HTTP en asp.net (C#):

public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "application/json"; 
     context.Response.Write("{ status: 'success' }"); 
    } 

hth,

Matti

0

I recibió un error similar. Me tomó un tiempo averiguarlo: poco sabía que PHP no ha (nativamente) compatible con JSON desde PHP5.2. Recordatorio crítico ...

0

Ayer a $. Ajax todavía no hay errores, hoy se cita el error, algunos dicen que parsererror versión jquery del problema, lo que yo uso es jquery-1.3.2.min.js, ayer. Esta edición también hecha, hoy está vaciada. Fuentes de datos: sin cambios. ¿No sabes qué razón?

+3

Eso tomó dos lecturas para que yo entendiera. x-) –

0

Es tal vez porque el búfer de salida no está vacío, por lo AJAX recibir bytes que no pertenecen a la JSON.

Pruebe limpiar el búfer con ob_clean() en el lado del servidor justo antes de la salida de su json con echo o die(). Y no necesita especificar contentType, creo que para usted el valor predeterminado funcionará correctamente.

Tuve el mismo problema y lo solucionó.

Espero poder ayudarte.

0

en mi caso, el error fue causado por una etiqueta html en el json.

incorrecto (parsererror)

{"msg": "Gracias,<br>Nos pondremos en contacto."} 

CORRECTO

{"msg": "Gracias, nos pondremos en contacto."} 

navegador: Internet Explorer 7/IE8

+0

hay alguna salida si mi respuesta es seguro que incluye etiquetas html para IE7/IE8 – Gagan

0

también probar esto

$.ajax({ 
    url: url, 
    data:datas, 
    success:function(datas, textStatus, jqXHR){ 
    var returnedData = jQuery.parseJSON(datas.substr(datas.indexOf('{'))); 
})}; 

en mi caso el servidor responde con carácter desconocido antes de e '{'

1

¡Este es un ejemplo de trabajo y probado!

<script type="text/javascript"> 

function fetchData() { 
var dataurl = "pie.json"; 
$.ajax({ 
    url: dataurl, 
    cache: false, 
    method: 'GET', 
    dataType: 'json', 
    success: function(series) { 
     var data = []; 
     //alert(series.length); 
     for (var i=0; i<series.length;i++){ 
      data[i]=series[i]; 
     } 

     $.plot(
       $("#placeholder"), 
       data, 
       { 
        series: { 
         pie: { 
         show: true, 
         label: { 
          show: true 
         } 
        } 
        }, 
        legend: { 
         show: true 
        } 
        } 
     ); 
    } 
}); 

    //setTimeout(fetchData, 1000); 
} 
</script> 

Y la fuente JSON es la siguiente (pie.json):

[{ "label": "Series1", "data": 10}, 
{ "label": "Series2", "data": 30}, 
{ "label": "Series3", "data": 90}, 
{ "label": "Series4", "data": 70}, 
{ "label": "Series5", "data": 80}, 
{ "label": "Series6", "data": 110}] 
0

No utilice un cuadro matriz, y asegúrese de dar formato a los datos correctamente:

{"account":{"iId":"1","heading":"Management Services","body":"<h1>Program Overview</h1><h1>January 29, 2009</h1>"}} 
Cuestiones relacionadas