web-dev-qa-db-fra.com

Jquery getjson - ajax parseError

J'ai essayé d'analyser la réponse JSON suivante avec le JQuery Getjson et Ajax:

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

J'ai aussi essayé d'échapper aux personnages "/" comme celui-ci:

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

Lorsque j'utilise le getjson, la dose n'exécute pas le rappel. Alors, je l'ai essayé avec JQuery Ajax comme suit:

$.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);
    }
});

L'AJAX frappe l'erreur ANS alerte ce qui suit:

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

textStatus=parseerror

errorThrown=undefined

Ensuite, j'ai essayé une simple jquy à renvoyer le JSON en utilisant le code suivant:

$.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");
})

Le .GET renvoie le JSON, mais l'EVAL apparaît avec des erreurs, quelle que soit la modification du JSON (en-tête de type de contenu, d'autres variantes du format, etc.)

Ce que je suis arrivé, c'est qu'il semble y avoir une question de retour du HTML dans le JSON et de la faire analyser. Cependant, j'espère que j'avais peut-être manqué quelque chose qui me permettrait d'obtenir ces données via Json. Quelqu'un a-t-il une idée?

15
JW

La chaîne JSON que vous avez est une matrice avec 1 objet à l'intérieur, afin d'accéder à l'objet que vous devez accéder au tableau d'abord. Avec un json.php qui ressemble à ceci:

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

Je viens d'essayer ça

$.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"
});

J'ai aussi essayé ceci:

$.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" 
});

Et ils ont tous deux travaillé bien pour moi.

7
Paolo Bergantino

Si quelqu'un a toujours des problèmes avec cela, c'est parce que votre réponse doit être une chaîne JSON et un type de contenu de contenu "Application/JSON".

Exemple pour http dans asp.net (C #):

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

hth,

Matti

3
user291586

Désactiver Firebug Lite a résolu ce problème pour moi.

Bug avec combinaison de: JQuery 1.4, Ajax/Json, Firebug Lite et IE 8

1
Lynn Dylan Hurley

Supprimez le [], à l'avant et dernier sur JSONDATA, et cela fonctionne.

1
user263473

Vous pourriez avoir le retour comme texte, puis l'analyser avec le JSON.ORG parser
Pour voir si cela fonctionne différemment

1
cobbal

Ceci est un exemple de travail et testé!

<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>

Et la source JSON est la suivante (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}]
1
fureszpeter

dans mon cas, l'erreur a été causée par une étiquette HTML dans le JSON.

Incorrect (parserError)

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

CORRECT

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

Navigateur: IE7/IE8

0
Jorge Olivares

Je pense que vous demandez une mauvaise question. Utiliser $ .getjson () est beaucoup plus facile, et si vous avez du mal à cela, il serait préférable de demander $ .getjson () que pour $ .ajax (). Vous pouvez également trouver utile en regardant le code source de la fonction Getjson, car je vois, vous avez beaucoup de choses inutiles avec des MIMETYPES. Ce n'est pas comme ça.

0
Thinker

La valeur que vous essayez d'analyser est enveloppée entre crochets [], ce qui signifie qu'il s'agit d'une matrice. Vous essayez d'évaluer un tableau. Essayez d'évaluer le premier élément de la matrice, et cela devrait fonctionner ...

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

En outre, je recommanderais d'utiliser le JSON.PARSE () fourni ici au lieu d'appeler eval () directement.

0
Josh Stodola

N'utilisez pas de boîtier de tableau et assurez-vous de formater vos données correctement:

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

C'est peut-être parce que votre tampon de sortie n'est pas vide, donc AJAX Recevoir des octets qui n'appartiennent pas au JSON.

Essayez de nettoyer la mémoire tampon avec ob_clean() sur le côté du serveur, juste avant de sortir votre JSON avec echo ou die(). Et vous n'avez pas besoin de spécifier contentType, je pense que pour votre valeur par défaut fonctionnera correctement.

J'ai eu le même problème et cela le résolvez.

J'espère vous aider.

0
Elorfin

J'ai reçu une erreur similaire. M'a pris un moment pour le savoir - je savais peu que je sache que PHP n'a pas (natif) JSON pris en charge depuis PHP5.2. Rappel critique ...

0
Adrian van Vliet

essayez aussi ceci

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

dans mon serveur de cas répond avec un caractère inconnu avant '{'

0
valir

Hier à $. AJAX N'EST TOUJOURS AUCUNE DES MRISTES AUJOURD'HUI EST CRIENDRE L'erreur, certains disent la version parserError JQuery du problème, ce que j'utilise est JQuery-1.3.2.min.js, hier. Cette édition a également fait, aujourd'hui est lavée. Sources de données: pas de changement. Je ne sais pas quelle raison être?

0
郑州网建