JSON-Zeichenfolge zum JS-Objekt

73

Ich verwende ein JS-Objekt, um Diagramme mit Google-Visualisierung zu erstellen. Ich versuche die Datenquelle zu entwerfen. Zuerst habe ich ein JS-Objekt clientseitig erstellt.

var JSONObject = {
  cols: [{
      id: 'date',
      label: 'Date',
      type: 'date'
    },
    {
      id: 'soldpencils',
      label: 'Sold Pencils',
      type: 'number'
    },
    {
      id: 'soldpens',
      label: 'Sold Pens',
      type: 'number'
    }
  ],
  rows: [{
      c: [{
        v: new Date(2008, 1, 1),
        f: '2/1/2008'
      }, {
        v: 30000
      }, {
        v: 40645
      }]
    },
    {
      c: [{
        v: new Date(2008, 1, 2),
        f: '2/2/2008'
      }, {
        v: 14045
      }, {
        v: 20374
      }]
    },
    {
      c: [{
        v: new Date(2008, 1, 3),
        f: '2/3/2008'
      }, {
        v: 55022
      }, {
        v: 50766
      }]
    }
  ]
};

var data = new google.visualization.DataTable(JSONObject, 0.5);

Jetzt muss ich die Daten dynamisch abrufen. Also sende ich eine AJAX-Anfrage an eine Seite, die die JSON-Zeichenfolge zurückgibt:

 "cols: [{id: 'date', label: 'Date', type: 'date'},
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'},
{id: 'soldpens', label: 'Sold Pens', type: 'number'}],
  rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]},
      {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]},
{c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}"

Dies speichere ich in einer Variablen:

var var1 = "cols: [{i ....... 66}]}"

und zeigen als

alert(var1);

Jetzt ist meine Aufgabe, aus dieser Zeichenfolge ein JS-Objekt zu erstellen. Das funktioniert nicht. Wenn ich ein JS-Objekt verwende, funktioniert alles einwandfrei und ich kann mein gewünschtes Diagramm abrufen. Wenn ich nun versuche, den gleichen Wert der Zeichenfolge aus der AJAX-Anforderung, die ich anhand einer Warnmeldung bestätigt habe, in ein Objekt einzufügen, wird das Objekt nicht korrekt erstellt. Bitte teilen Sie mir Ihre Meinung und eventuelle Korrekturen oder Ratschläge mit.

Vinod
quelle
1
Verwenden Sie die Javascript- eval(json_string)Methode, um eine Zeichenfolge für das JSON-Objekt abzurufen. Seien Sie jedoch gewarnt, dieselbe Funktion kann möglicherweise gefährlich sein, da sie auch Skripte ausführen kann.
Buhake Sindi
1
nur ein FYI - Schlüsselnamen und Strings muss drin sein "‚s in gültiger JSON: simonwillison.net/2006/Oct/11/json
gnarf
Mögliches Duplikat der Serialisierung an JSON in jQuery
outis
Überprüfen Sie dies aus w3schools.com/json/json_eval.asp
Mehmet Ataş

Antworten:

136

Einige moderne Browser unterstützen das Parsen von JSON in ein natives Objekt:

var var1 = '{"cols": [{"i" ....... 66}]}';
var result = JSON.parse(var1);

Für die Browser, die dies nicht unterstützen, können Sie json2.js von json.org herunterladen, um ein JSON-Objekt sicher zu analysieren. Das Skript prüft, ob native JSON-Unterstützung vorhanden ist. Wenn diese nicht vorhanden ist, stellen Sie stattdessen das globale JSON-Objekt bereit. Wenn das schnellere native Objekt verfügbar ist, wird das Skript einfach beendet und bleibt intakt. Sie müssen jedoch einen gültigen JSON angeben, da sonst ein Fehler ausgegeben wird . Sie können die Gültigkeit Ihres JSON mit http://jslint.com oder http://jsonlint.com überprüfen .

Andy E.
quelle
5

Sie können eval (jsonString) verwenden, wenn Sie den Daten in der Zeichenfolge vertrauen. Andernfalls müssen Sie sie ordnungsgemäß analysieren. Überprüfen Sie json.org auf einige Codebeispiele.

Whackamole
quelle
1
Kann ich Inhalten aus der API einer großen Website (Reddit) vertrauen?
5

Die Zeichenfolge in Ihrer Frage ist keine gültige JSON-Zeichenfolge. Von der Website json.org :

JSON basiert auf zwei Strukturen:

* A collection of name/value pairs. In various languages, this is 
  realized as an object, record, struct, dictionary, hash table, keyed list, or
  associative array.
* An ordered list of values. In most languages, this is realized as an
  array, vector, list, or sequence.

Grundsätzlich beginnt eine JSON-Zeichenfolge immer mit {oder [.

Dann können Sie, wie @Andy E und @Cryo sagten, die Zeichenfolge mit json2.js oder einigen anderen Bibliotheken analysieren.

IMHO sollten Sie eval vermeiden, da es jedes Javascript-Programm wird, so dass Sie in Sicherheitsproblemen auftreten können.

Filippo
quelle
4

Sie können diese Bibliothek von JSON.org verwenden, um Ihre Zeichenfolge in ein JSON-Objekt zu übersetzen.

var var1_obj = JSON.parse(var1);

Oder Sie können auch die jquery-json- Bibliothek verwenden.

var var1_obj = $.toJSON(var1);
Nortron
quelle
3

Die von Ihnen zurückgegebene Zeichenfolge ist ungültiger JSON. Die Namen in den Objekten müssen in Anführungszeichen gesetzt und die gesamte Zeichenfolge muss eingegeben werden { … }, um ein Objekt zu bilden. JSON kann auch so etwas nicht enthalten new Date(). JSON ist nur eine kleine Teilmenge von JavaScript , die nur Zeichenketten hat, Zahlen, Objekte, Arrays true, falseund null.

Weitere Informationen finden Sie in der JSON-Grammatik .

Gumbo
quelle