JSON aus File dynamisch laden? und als Objekt global definieren?
Stelios
- javascript
0 Struppi
Hallo,
ich hab folgendes Problem. Ich möchte aus einen File das auf dem Webserver generiert wird JSON auslesen und das als globales Objekt definieren und von überall zugreifen. Hab schon zig Lösungen ausprobiertr aber keine hat funktioniert. Ist es ein programmierefehler oder ein denkfehler? Vielleicht könnt Ihr mir weiterhelfen.
Hier der Code baustein.
<script type="text/javascript">
//<![CDATA[
var JSON; // Mein JSON global definieren
// JSON aus datei laden und global definieren
function loadJSON(fname) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('application/json');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
return false;
}
http_request.onreadystatechange = function () {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// muss hier noch ein wait oder sowas rein???
// oder nur ein JSON = eval('(' + http_request.responseText + ')');
return JSON = eval('(' + http_request.responseText + ')');
} else {
alert('Bei dem Request ist ein Problem aufgetreten.');
}
}
};
http_request.open('GET', fname, true);
http_request.send(null);
}
// Version aus JSON auslesen
function get_version(n) { return n.version; }
// Dataclass auslesen und ausgeben
function get_dataclass(n, datatype) {
var dc;
for (var i=0; i < n.definitions.length; i++) {
var def = n.definitions[i];
dc = def;
if (datatype != def.type ) continue;
document.write("<b>DC : </b>" + dc.id + " : " + dc.caption + " : " + dc.vistype + " : " + dc.unit + " : " + dc.min + " : " + dc.max + " : <br>");
}
}
// JSON laden
JSON = loadJSON('myjson.json');
document.write("DEBUG : " + JSON + "<br>"); // liefert undefined
document.write("DEBUG Version: " JSON.version); // liefert JSON has no properties
// hier bricht das Skript ab
document.write("<h2>Version (" + JSON.version + ")</h2>");
document.write("<b>Version : </b>" + get_version(JSON) + "<br>" );
document.write("<h2>Get Dataclass (" + JSON.definitions.length + ")</h2>");
//]]>
</script>
Bei den Kommentierten stellen steht was das Skript für Ausgaben macht bzw. was es für Fehler ausgibt.
Hier noch die datei myjson.json :
{
"definitions": [
{ "type" : "dataclass", "id" : "myid1", "caption":"Das ist Id 1", "vistype":"image", "unit":"myunit", "min":10, "max":50 },
{ "type" : "dataclass", "id" : "myid2", "caption":"Das ist Id 1", "vistype":"image", "unit":"myunit", "min":10, "max":50 }
],
"version":1.1
}
Vielen Dank im voraus
Stelios
Ist es ein programmierefehler oder ein denkfehler? Vielleicht könnt Ihr mir weiterhelfen.
Denkfehler.
http_request.onreadystatechange = function () {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
// muss hier noch ein wait oder sowas rein???
// oder nur ein JSON = eval('(' + http_request.responseText + ')');
Nein, eben nicht, die Funktion wird aufgerufen wenn die Daten ankommen, erst dann.
// JSON laden
JSON = loadJSON('myjson.json');
Jetzt sind die Daten 100% noch nicht da.
document.write("DEBUG : " + JSON + "<br>"); // liefert undefined
Logisch.
Du kannst erst nach Aufruf der Funktion onreadychange die Daten ausgeben, AJAX ist asynchron.
Struppi.