Eigentlich sollte der Artikel „groovy json“ heißen, doch dann habe ich mir gedacht: „Warum schreibst Du ihn nicht gleich für alle 3 Programmiersprachen, mit denen du Webanwendungen schreibst?“. Das wäre doch ein Abwasch.
Nun gut, dies ist der Versuch dem Gedanken Taten folgen zu lassen.
Doch vielleicht eine kurze Erläuterung dazu, was JSON überhaupt ist (alle Webentwickler können diese Stelle überspringen).
Fragt man die Wikipedia, erhält man folgende Antwort:
Die JavaScript Object Notation, kurz JSON (IPA: /ˈdʒeɪsʌn/), ist ein kompaktes Datenformat in für Mensch und Maschine einfach lesbarer Textform zum Zweck des Datenaustauschs zwischen Anwendungen.
Alles klar? Dann geht es hier auch für die Webentwickler weiter.
Java
Schaut man sich ein bisschen im Netz um, so stößt man als erstes auf die google-gson Bibliothek. Momentan liegt sie in der Version 2.2.4 vor und erfüllt genau die Anforderung (Objekt -> json).
Als erstes aber die Test Klassen:
package de.koo.json.beans; import java.util.List; public class User { private String username; private String firstname; private String lastname; private List<String> emails; private List<Role> roles; public User(String username, String firstname, String lastname) { super(); this.username = username; this.firstname = firstname; this.lastname = lastname; } public void setEmails(List<String> emails) { this.emails = emails; } public void setRoles(List<Role> roles) { this.roles = roles; } } package de.koo.json.beans; public class Role { private String rolename; public Role(String rolename){ this.rolename=rolename; } }
Der JUnit Test erzeugt dann davon die notwendigen Objekte und die JSON Representation des User Objekts.
package de.koo.test.json; import java.util.Arrays; import org.junit.Test; import com.google.gson.Gson; import de.koo.json.beans.Role; import de.koo.json.beans.User; public class GsonTest { @Test public void toJson() { User user=new User("juhu","Ju","Hu"); String[] emails={"ju@foobar.com","juhu@foobar.com"}; user.setEmails(Arrays.asList(emails)); Role[] roles={new Role("user"), new Role("admin")}; user.setRoles(Arrays.asList(roles)); Gson gson = new Gson(); String json = gson.toJson(user); System.out.println(json); } }
PHP
In PHP verwendet man für die JSON Konvertierung die Funktion json_encode
. Den Zugriff auf die Attribute eines Objektes erhält man mit der Funktion get_object_vars
. Folgendes Beispiel zeigt, wie beide zusammenarbeiten (siehe auch [2]).
Diese Lösung funktioniert leider nicht mit Attributen, die ein Array von Objekten enthalten.
class User { private $username; private $firstname; private $lastname; private $emails; private $role; function __construct($username,$firstname,$lastname,$role) { $this->username=$username; $this->firstname=$firstname; $this->lastname=$lastname; $this->role=new Role($role); } function setEmails($emails) { if (is_array($emails)) $this->emails=$emails; } function getJsonData() { $var = get_object_vars($this); foreach($var as &$value){ if(is_object($value) && method_exists($value,'getJsonData')){ $value = $value->getJsonData(); } } return ($var); } function toJson(){ return json_encode($this->getJsonData()); } } class Role { private $rolename; function __construct($rolename){ $this->rolename=$rolename; } function getJsonData() { $var = get_object_vars($this); foreach($var as &$value){ if(is_object($value) && method_exists($value,'getJsonData')){ $value = $value->getJsonData(); } } return ($var); } } $user=new User("juhu","Ju","Hu","admin"); $user->setEmails(array("ju@foobar.com","juhu@foobar.com")); echo $user->toJson(),"\n";
Groovy
Groovy ist der „syntax sugar“ für Java und mindert dessen Geschwätzigkeit. Auch hier benötigen wir als Erstes die Test Klassen.
package de.koo.json import java.util.List; import de.koo.json.Role; class User { def username def firstname def lastname def emails List<Role> roles } package de.koo.json class Role { def rolename }
Zur Konvertierung in JSON Format benutzt man die statische toJson
Methode aus der JsonOutput
Klasse. Einfacher geht es wirklich nicht.
package de.koo.test.json import static org.junit.Assert.* import groovy.json.JsonOutput import org.junit.Test import de.koo.json.Role import de.koo.json.User class JsonTest { @Test public void toJson() { def user=new User(username:"juhu",firstname:"Ju",lastname:"Hu") user.emails=["ju@foobar.com","juhu@foobar.com"] user.roles=[new Role(rolename:"admin"), new Role(rolename:"user")] println JsonOutput.toJson(user) } }
Links: