2009-09-24 5 views
0

Mon service renvoie l'objet JSON suivant, avec l'en-tête Content-Type défini sur "application/javascript". Il est enveloppé dans des parens par instructions à json.org] 2, mais j'ai essayé avec et sans parens. Sans parens, il passe la vérification de jsonlint.Problème lors de l'analyse du résultat JSON avec le prototype

({"products": {"itemId": "0", "productId": "1234", "quantity": "4", "rank": "12", "subProductId": ""}, "txnId": "1"}) 

Si j'Eval explicitement la réponse, comme indiqué ci-dessous, je n'ai pas de problème:

var form = $('productListRequestForm'); 
form.request(
{ 
    onSuccess : 
     function(response) 
     { 
      var json = eval(response.responseText); 
      rebuildWishlistTable(json); 
     }, 
    onFailure : 
     function(response) 
     { 
      alert("AJAX request failed: " + response.responseText); 
     } 
}); 

Cependant, si je compte sur Prototype analyse de la réponse et en passant le résultat de l'analyse en tant que second paramètre ma fonction comme ci-dessous, cette valeur est toujours nulle. Selon le Prototype docs, cela devrait fonctionner. Y a-t-il quelque chose qui me manque ou quelque chose qui leur manque?

var form = $('productListRequestForm'); 
    form.request(
    { 
     onSuccess : function(response, json) 
      { 
       rebuildWishlistTable(json); 
      }, 
     onFailure : 
      function(response) 
      { 
       alert("AJAX request failed: " + response.responseText); 
      } 
    }); 

Répondre

1

Il ressemble à un bogue dans Prototype.

À la ligne 1497 dans la révision 1.6.1, il y a le code suivant:

var contentType = response.getHeader('Content-type'); 
    if (this.options.evalJS == 'force' 
     || (this.options.evalJS && this.isSameOrigin() && contentType 
     && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) 
    this.evalResponse(); 

Notez que rien ne se fait avec le retour de evalResponse(). Si nous puis passez à la définition de cette fonction:

evalResponse: function() { 
    try { 
     return eval((this.transport.responseText || '').unfilterJSON()); 
    } catch (e) { 
     this.dispatchException(e); 
    } 
    }, 

Publié un bug sur le site du prototype, et il a été fermé avec le commentaire que j'ai eu « plusieurs malentendus » concernant JSON, et ne devrait pas utiliser le système de signalement de bogues pour obtenir de l'aide. Drôle, je pensais que je signalais où ils jetaient une valeur de retour.

Dans le cas où quelqu'un d'autre pourrait avoir une situation similaire, je suis en train de modifier ma question pour montrer le code qui fonctionne et qui ne fonctionne pas, et acceptera cette réponse.

0

Surround avec parenthèses

eval("({\"products\"": {\"itemId\": \"0\", \"productId\": \"1234\", \"quantity\": \"4\", \"rank\": \"12\", \"subProductId\": \"\"}, \"txnId\": \"1\"})") 

qui fonctionnera pour vous

+0

Non, en fait ce n'est pas le cas. Comme je le note dans mon post, l'eval explicite fonctionne - et comme je le note aussi, j'enveloppe le JSON en parens pour le faire. Le problème est que l'auto-évaluation de Prototype ne fonctionne pas, que le JSON soit enveloppé dans des parenthèses ou non. – kdgregory

Questions connexes