TrashMaxx: Javascript-Array in JSON-String umwandeln

Hallo zusammen.

Ich habe ein assoziatives Javascript-Array, welches Strings und weitere Arrays enthält.
Dieses möchte ich für eine serverseitige Verarbeitung in einen JSON-String umwandeln.

Über Google habe ich die folgenden 2 Möglichkeiten gefunden:

1. über dieses Skript:
http://www.json.org/json2.js

2. über das jQuery-Plugin jqery-json:
http://code.google.com/p/jquery-json/

Leider gelingt mir keine der beiden Möglichkeiten.
Ich habe beide Dateien mal eingebunden und ein ganz einfaches Test-Array erstellt, welches nur einen String enthält:

  
var test = Array();  
test['test1'] = 'test2';  

Möglichkeit 1 rufe ich so auf:

  
var myJSONText = JSON.stringify(test);  

Möglichkeit 2 so:

  
var myJSONText = $.toJSON(test);  

Wenn ich mir nun myJSONText per alert anzeigen lasse, steht da nur '[]' drin (ohne Anführungszeichen). Und das bei beiden Möglichkeiten.

Was mache ich falsch? Oder habe ich irgendwas grundsätzlich falsch verstanden?
Beide Skripte sind wohl korrekt eingebunden, denn sie produzieren ja immerhin das '[]'.

Bin ziemlich ratlos und hoffe auf Hilfe!

Liebe Grüße

  1. Was mache ich falsch? Oder habe ich irgendwas grundsätzlich falsch verstanden?

    Ja. Es gibt keine »assoziativen Arrays« in JavaScript.

    JavaScript kennt Objekte und alles ist ein Objekt (bzw. kann sich wie eines verhalten). Objekte sind Zuordnungslisten, die unter gewissen Namen gewisse Werte speichern. Diese Einträge nennt man (Objekt-)Eigenschaften. In anderen Programmiersprachen wird eine solche Datenstruktur Hash genannt. In PHP beispielsweise gibt es keine Trennung zwischen Hashes und rein numerischen Arrays. In JavaScript gibt es zwar auch keine, aber es ist trotzdem anders.

    Beispiel für einen Objekt-Literal (Kurzschreibweise zum Erzeugen von generischen Object-Objekten):

    var o = {  
       eigenschaft : 'wert'  
    };
    

    JavaScript kennt ferner Arrays. Arrays sind auch nur Objekte, besitzen also Eigenschaften und Werte. Was sie von allgemeinen Objekten unterscheidet, ist, dass sie i.d.R. nur numerische Eigenschaften haben. Die Eigenschaften heißen also '0', '1', '2', '3' usw. Die Standardmethoden von Arrays operieren jedenflls nur auf diesen Eigenschaften.

    Du *kannst* einem Array natürlich weitere Eigenschaften anhängen - das tust du in deinem Beispiel. Diese können auch anders heißen, aber sie sind bloß irgendwelche Objekteigenschaften und werden *nicht* als Elemente des Arrays gezählt.

    Wenn du jetzt JSON.stringify() auf einen Array loslässt, dann beachtet diese Methode nur die Eigenschaften, die numerisch sind. Es durchläuft den Array mit for (var i = 0, l = array.length; i < l; i++) oder ähnlich. Dabei werden nicht-numerische Eigenschaften, die das Objekt zusätzlich haben mag, nicht gefunden - und tauchen in der Serialisierung nicht auf. Sie könnten es auch nicht, weil der Array-Literal, der erzeugt wird, deren Serialisierung nicht zulässt.

    Also entweder ein Array mit drei Elementen:

    var array = ['foo', 'bar', 'quux'];  
    alert(array[0] + ' ' + array[1] + ' ' + array[2]);  
    alert(JSON.stringify(array)); // gibt ["foo","bar","quux"] aus
    

    Oder ein generisches Objekt mit drei Eigenschaften:

    var object = {  
      foo : 'wert1',  
      bar : 'wert2',  
      quux : 'wert3'  
    };  
    alert(object.foo);  
    alert(JSON.stringify(object)); // Gibt {"foo":"wert1","bar":"wert2","quux":"wert3"} aus
    

    Das suchst du also.

    Weiter Erklärungen:
    http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays (dort steht eigentlich alles, was ich oben geschrieben habe)
    http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-literale
    http://molily.de/js/organisation-module.html#object-literal

    M.

  2. Moin,

    Dieses möchte ich für eine serverseitige Verarbeitung in einen JSON-String umwandeln.

    Du möchtest serverseitig eine Response erzeugen, die im DOM als Array erkannt wird, in Perl geht das so:

    print "Content-Type: text/plain; charset=UTF-8\n\n";
    print qw(["Otto", "Anna", "Fritz"]), "\n"; # Ajax Response

    Ich habe ein assoziatives Javascript-Array, welches Strings und weitere Arrays enthält.

    Aus o.g. Response erhältst Du mit eval(response) ein DOM-gerechtes Array. Sofern das ein Objekt mit benamsten Attributen sein soll, verwendest Du statt der eckigen Klammern geschweifte Klammern, das ist der ganze Zauber ;-)

    Hotti

    --
    Mistwetter!
  3. var test = Array();
    test['test1'] = 'test2';

      
    Du erstellst ein Array und schreibst dann eine nicht-Array-Eigenschaft, wodurch die Array-Instanziierung überschrieben wird:  
      
    ~~~javascript
    var test = Array();  
    test instanceOf Array == true;  
    test['test1'] = 'test2';  
    test instanceOf Array == false;
    

    Dann kannst Du auch gleich ein Objekt nehmen. Für die Umwandlung in JS-Code nimmst Du JSON, wie Dir alle anderen auch schon gesagt haben.

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
    1. Du erstellst ein Array und schreibst dann eine nicht-Array-Eigenschaft, wodurch die Array-Instanziierung überschrieben wird:

      Was heißt denn »die Array-Instanziierung wird überschrieben«?

      var test = Array();

      test instanceOf Array == true;
      test['test1'] = 'test2';
      test instanceOf Array == false;

        
      Ähm? Hast du den Code mal laufen lassen?  
      Das ist falsch, natürlich bleibt der Array auch nach dem Anhängen einer nichtnumerischen Eigenschaft ein Array. instanceof prüft, ob die prototype-Eigenschaft der angegebenen Funktion in der Prototype-Chain des Objekts vorkommt. Das Zuweisen einer Eigenschaft ändert doch nicht die Prototype-Chain (außer \_\_proto\_\_ natürlich ;)). Im Übrigen müsste es instanceof statt instanceOf heißen.  
        
      Mathias
      
  4. Danke für die vielen Antworten.

    Wie einfach es doch manchmal ist :)
    Oject() statt Array() verwendet und schwupps - läuft.

    Thx.