Stelios: JSON aus File dynamisch laden? und als Objekt global definieren?

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

  1. 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.

    --
    Javascript ist toll (Perl auch!)