2010-11-22 7 views
3

Je rencontre des problèmes pour utiliser un serveur Web tiers au format JSON. La réponse JSON du serveur ressemble un peu à ceci:Problème lors de l'analyse JSON

{ 
    "ID":10079, 
    "DateTime":new Date(1288384200000), 
    "TimeZoneID":"W. Europe Standard Time", 
    "groupID":284, 
    "groupOrderID":10 
} 

I JavaScript utiliser sans libs supplémentaires pour analyser le JSON.

//Parse JSON string to JS Object    
var messageAsJSObj = JSON.parse(fullResultJSON); 

L'analyse échoue. Un validateur JSON me dit, "new Date (1288384200000)" n'est pas valide.

Y at-il une bibliothèque qui pourrait m'aider à analyser la chaîne JSON?

+5

'new date (1288384200000)' est une commande JavaScript est probablement destiné à être exécuté directement. Ne peut pas penser à un moyen de faire cela sauf 'var = eval (données);' Ceci n'est pas correct JSON, vous devriez en plaindre au tiers –

Répondre

5

Comme d'autres l'ont souligné, c'est JSON invalide. Une solution consiste à utiliser eval() au lieu de JSON.parse() mais cela vous laisse un problème de sécurité potentiel à la place.

Une meilleure approche pourrait être de rechercher et remplacer ces questions incriminées, transformant les données en JSON valide:

fullResultJSON = fullResultJSON.replace(/new Date\((\d+)\)/g, '$1'); 

Vous pouvez même aller plus loin et « relancer » ces champs dans des objets JavaScript de date à l'aide le second argument pour JSON.parse():

var messageAsJSObj = JSON.parse(fullResultJSON, function (key, value) { 
    if (key == "DateTime") 
     return new Date(value); 

    return value; 
}); 

Voici un exemple: http://jsfiddle.net/AndyE/vcXnE/

+0

Super Andy, ça a marché, ça! ;) – j7nn7k

0

try var obj = eval ('(' + fullResultJSON + ')'); et vous aurez l'objet comme dit Pekka. N'oubliez pas d'utiliser le '()' supplémentaire cependant. Et en effet json devrait avoir à la fois la propriété et la valeur entre guillemets.

0

Parsing échoue parce que tout ce que vous pouvez analyser dans un objet JSON sont nulles, des chaînes, des nombres, des objets, des tableaux et des valeurs booléennes si new Date(1288384200000), ne peut pas être analysé

Vous avez également un autre problème, la dernière propriété ne devrait pas avoir la virgule flottante.

+0

jsonlint dit que json est formellement invalide avec la dernière virgule. –

+0

@fcalderan: ça ne fait rien, mon cerveau a eu une petite fusion. Bien sûr, les littéraux JSON et JS Object ne sont pas la même chose et la virgule de fin est en effet invalide. Cependant, il peut avoir (et probablement fait) juste coupé le résultat JSON à la partie pertinente sans enlever la virgule du dernier élément. –

+0

@ Andy: Oui, je l'ai fait;) – j7nn7k

3

Votre exemple n'est pas valide JSON, car JSON est une technologie d'échange de données. Vous pouvez transformer votre exemple en un objet en utilisant Javascript eval:

var almostJSON = "{ 
    "ID":10079, 
    "DateTime":new Date(1288384200000), 
    "TimeZoneID":"W. Europe Standard Time", 
    "groupID":284, 
    "groupOrderID":10, 
}"; 

puis eval ing il:

var myObject = eval('(' + almostJSON + ')'); 

Ensuite, myObject devrait tenir ce que vous cherchez.

Notez que les fonctions ne sont pas autorisées dans JSON car cela pourrait compromettre la sécurité.

+5

Il semble un peu peu sûr de moi, juste pour évaluer tout ce qui vient d'un homologue distant. – scheffield

+1

@scheffield: c'est vrai. Si vous attendez un JSON valide d'un tiers et obtenez quelque chose comme ceci, vous avez une raison valable d'être suspicieux. – darioo