Konvertierung von (java|php|groovy) Objekten ins JSON Format

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:

[1] google-gson
[2] Serializing PHP object to JSON

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: