2010-11-22 17 views
3

Ich stoße Probleme auf, um einen Drittanbieter-Webdienst im JSON-Format zu verwenden. Die JSON Antwort vom Server sieht irgendwie wie folgt aus:Problem beim Analysieren von JSON

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

I JavaScript ohne zusätzliche Bibliotheken verwenden, um die JSON zu analysieren.

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

Die Analyse schlägt fehl. Ein JSON-Validator sagt mir, "neues Datum (1288384200000)" ist nicht gültig.

Gibt es eine Bibliothek, die mir helfen könnte, die JSON-Zeichenfolge zu analysieren?

+5

'new Date (1288384200000)' ist ein JavaScript-Befehl, soll wahrscheinlich direkt ausgeführt werden. Ich kann mir keinen Weg vorstellen, dies zu tun, außer 'var = eval (data);' Das ist kein richtiger JSON, du solltest dich darüber beschweren –

Antwort

5

Wie andere darauf hingewiesen haben, ist es ein ungültiger JSON. Eine Lösung besteht darin, eval() anstelle von JSON.parse() zu verwenden, was jedoch ein potenzielles Sicherheitsproblem zur Folge hat.

Ein besserer Ansatz könnte suchen und diese beanstandeten Ausgaben ersetzen, um die Daten in gültige JSON drehen:

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

Sie noch einen Schritt weiter und „wiederbeleben“ diese Felder in JavaScript Date-Objekte gehen können mit das zweite Argument für JSON.parse():

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

    return value; 
}); 

Hier ein Beispiel: http://jsfiddle.net/AndyE/vcXnE/

+0

Großer Andy, das hat funktioniert, thaks! ;) – j7nn7k

0

versuchen var obj = eval ('(' + fullResultJSON + ')'); und du wirst das Objekt haben wie Pekka sagte. Vergiss nicht, das extra '()' zu benutzen. Und tatsächlich sollte Json sowohl die Eigenschaft als auch den Wert in Anführungszeichen eingeschlossen haben.

0

Parsing fehlschlägt, weil alles, was Sie in einem JSON-Objekt analysieren kann null sind, Strings, Zahlen, Objekte, Arrays und Boolesche Werte so new Date(1288384200000) kann nicht

Sie haben auch ein anderes Problem, letzte Eigenschaft sollte nicht analysiert werden das nachgestellte Komma.

+0

jsonlint sagt, dass der json formell ungültig ist mit dem letzten Komma. –

+0

@fcalderan: Macht mir nichts aus, mein Gehirn hatte eine kleine Kernschmelze. Natürlich sind JSON- und JS-Objektliterale nicht dasselbe und das abschließende Komma ist tatsächlich ungültig. Möglicherweise hat er das JSON-Ergebnis jedoch auf den relevanten Teil reduziert (und wahrscheinlich auch getan), ohne das Komma vom letzten Element zu entfernen. –

+0

@ Andy: Yup, habe ich;) – j7nn7k

3

Ihr Beispiel ist kein gültiger JSON, da JSON eine Datenaustauschtechnologie ist. Sie können Ihr Beispiel in ein Javascript-Objekt drehen eval mit:

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

und dann eval es ing:

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

Dann myObject sollte halten, was Sie suchen.

Beachten Sie, dass Funktionen in JSON nicht zulässig sind, da dies die Sicherheit beeinträchtigen könnte.

+5

Es sieht ein bisschen unsicher für mich aus, nur um alles von einer Gegenstelle zu bewerten. – scheffield

+1

@scheffield: das stimmt. Wenn Sie von einer Drittpartei ein gültiges JSON erwarten und so etwas erhalten, haben Sie einen triftigen Grund, verdächtig zu sein. – darioo

Verwandte Themen