JSON

Mit dem Flash Player 11 und Adobe AIR 3.0 wird endlich das Datenaustauschformat JSON nativ in ActionScript unterstützt. Nativ bedeutet, dass man keine weitere Bibliothek zum Parsen benötigt und direkt mit einer einfachen Syntax auf die Inhalte zugreifen kann (vergleichbar der nativen XML-Unterstützung).

Was ist JSON?

Wikipedia definiert JSON (JavaScript Object Notation) als „kompaktes Datenformat in für Mensch und Maschine einfach lesbarer Textform zum Zweck des Datenaustauschs zwischen Anwendungen.”

JSON ist also ein reines Datenaustauschformat, das sehr einfach aufgebaut und leicht zu verstehen ist. Es stellt in vielen Fällen also eine leichtgewichtige Alternative zu XML dar, die oftmals etwas weniger Overhead hat. Außerdem sind im Gegensatz zu XML typisierte Daten möglich, wenn auch nur einige Basisdatentypen.

Ein Ausschnitt einer JSON-Datei könnte wie unten abgebildet aussehen. Anzumerken ist, dass unterschiedliche Datentypen enthalten sein können:

  • String (z.B. "Max")
  • Number (z.B. 3.2)
  • Boolean (true oder false)
  • Array (z.B. ["Max", "Anna"])
  • Object (Key/Value-Paare in geschweiften Klammern, z.B. {"name": "Anna", alter: 23})

JavaScript:
  1. ...
  2. {
  3.   "playlist": [{
  4.     "name": "Werbevideos",
  5.     "type": "Video",
  6.     "featured": false,
  7.     "videos":
  8.       [
  9.         {
  10.           "title": "Deutschland",
  11.           "description": "Schwarzwald",
  12.          "videoLength": 2.3,
  13.          "rating": [2.1, 4.9, 4.2]
  14.         }, ...

Selbstverständlich kann man auch überprüfen, ob eine JSON-Datei valide ist (z.B. mit diesem JSON-Validator).

JSON in ActionScript parsen

Zuerst muss man seine JSON-Daten z.B. aus einer Datei laden und in einem String abspeichern. Diesen String kann man nun ganz einfach mit lediglich einer einzigen Zeile Code parsen lassen, die da lautet: JSON.parse().

Actionscript:
  1. // JSON parsen und in einer Instanz von der Klasse Object abspeichern
  2. var feeds:Object = JSON.parse( meinJsonString );

Einzelne JSON-Werte auslesen

Um nun an einzelne Werte aus den geparsten JSON-Daten zu gelangen, kann man über die Punktnotierung nativ darauf zugreifen (z.B. feeds[1].playlist[0].name). Treten Bestandteile mehrmals hintereinander auf, kann über die eckigen Klammern das gewünschte Element adressiert werden (beginnend ab 0 für das erste Element).

Actionscript:
  1. var playlistName:String = feeds[1].playlist[0].name;
  2. trace ("Name der zweiten Playlist:" + playlistName);

Wer das ActionScript3-Tutorial zu XML verstanden hat, wird an dieser Stelle merken, dass zwischen JSON und XML hier nun eigentlich kein Unterschied mehr besteht.

Praktisch ist, dass man die oben genannten Datentypen String, Number und Boolean direkt aus JSON übernehmen kann, wie das folgende Beispiel zeigt:

Actionscript:
  1. // featured ist in JSON vom Datentyp Boolean
  2. var featuredState:Boolean = feeds[1].playlist[0].featured;
  3. trace ("Die Playlist wird hervorgehoben: " + featuredState);
  4.  
  5. // videoLength ist in JSON vom Datentyp Number
  6. var videoLength:Number = feeds[1].playlist[0].videos[0].videoLength;
  7. trace ("Das erste Video der zweiten Playlist dauert " + videoLength + " h");

Als drittes Beispiel soll noch gezeigt werden, wie man ein JSON-Array ausliest.

Actionscript:
  1. var rating:Array = feeds[1].playlist[0].videos[0].rating;
  2. trace ("Bewertung: Spannung " + rating[0] + " // Schauspieler " + rating[1] + " // Musik " + rating[2]);

ActionScript in JSON wandeln („stringify”)

Mit der neuen Klasse JSON ist nicht nur das Parsen von JSON möglich, sondern auch das Wandeln von ActionScript-Objekten in einem JSON-String.

Ein einfacher Weg besteht darin, eine neue Instanz von der Klasse Object zu erstellen. Bekannterweise ist diese Klasse eine so genannte dynamische Klasse, so dass zur Laufzeit neue Eigenschaften hinzugefügt werden können. Deshalb kann man einfach die gewünschte Werte hinzufügen, wobei der Eigenschaftsname dem JSON-Key entspricht, der Wert dem JSON-Value.

Auch hier werden die Datentypen korrekt in JSON übernommen, wie das folgende Beispiel zeigt.

Actionscript:
  1. // ActionScript-Objekte in JSON wandeln
  2. var person:Object = new Object();
  3. person.name = "Maximilian Mustermann";
  4. person.nicknames = ["Maxi", "Maxl", "Max"];
  5. person.age = 2.5;
  6. person.registered = false;
  7.  
  8. trace (JSON.stringify(person));
  9.  
  10. //Output lautet:
  11. // {"age":2.5,"name":"Maximilian Mustermann","registered":false,"nicknames":["Maxi","Maxl","Max"]}

Außerdem besteht noch die Möglichkeit, den Parser zu beeinflussen. Gibt man zusätzlich ein Array mit Keys an, so werden nur diese Bestandteile in die Ausgabe übernommen. Anstatt des Arrays könnte laut Doku auch eine eigene Funktion angehängt werden („A function or an array that transforms or filters key/value pairs in the stringify Output”).

Actionscript:
  1. trace (JSON.stringify(person, ["name"]));
  2. //Output lautet:
  3. //{"name":"Maximilian Mustermann"}

Fazit

Dank der neue Klasse kann sehr einfach auf JSON-Daten zugegriffen werden. Falls jemand noch nützliche Tipps oder Erfahrungen mit JSON hat, einfach einen Kommentar hinterlassen.

Beispiel: jsonDemo.zip (Flex Sourcecode)
Link: Native JSON Support in AIR3
Link: ActionScript Reference Beta