Stefan M.
2 min readFeb 3, 2016

--

In einem privaten Projekt schreibe ich aktuelle eine Android App die mit einer, ebenfalls von mir selbst geschriebenen, App Engine als Backend kommuniziert.

Die Daten die hin und her geschickt werden, werden in JSON kodiert. Um die JSON Daten innerhalb der Android App in ordentliche Objekte zu wandeln, benutze ich Gson. Die Lib nimmt den JSON String und wandelt ihn “automatisch” in Objekte um. Um also aus folgendem JSON ein Java Objekt zu erstellen benötigt man diesen Code:

Das JSON File

{
"name" : "Stefan",
"age" : 24,
"location" : "Top Secret",
"nickname" : "StefMa"
}

Main.java

public class Main {

public Main() {
Gson gson = new Gson();
Human human = gson.fromJson(jsonString, Human.class);
}

}

Human.java

public class Human {

@SerializedName("name")
public String mName;

@SerializedName("age")
public int mAge;

@SerializedName("location")
public String mLocation;

@SerializedName("nickname")
public String mNickname;

}

Kommen wir zum Backend. Dort benutze ich Python als Programmiersprache. Eine für mich persönlich ziemlich coole Sprache. Einfach aufgebaut und man kommt schnell zu ziel.

Wie dem auch sei. Natürlich schicke ich auch von der App zum Server Informationen in Form von JSON. Um den JSON String nicht selbst via RegEx oder ähnlichem zu manipulieren, benutze ich ein Modul namens json. Das Modul serilisiert den JSON String über die loads methode. Das Problem — oder auch nicht — ist, dass man dabei “nur” ein Dictonary zurück bekommt. Bei einfachen JSON Files, wie im obigen Beispiel, funktioniert das noch recht gut. Da man im Dict nur ein KEY-Value hat. Alle Values kann man simple über dict[“key”] abholen. Aber was ist, wenn man ein komplizierteres JSON hat? Dann möchte man ungern dict[“key”][“nextKey”][“nextNextKey”][“nextNextNextKey”] eintippen.

Also möchte ich auch in Python schönere Objekte erhalten. Die loads() Methode hilft uns wenigstens etwas dabei. Man kann nämlich als Parameter einen “object_hook” mitgeben. Dem Parameter übergibt man eine Methode, die ein Dictonary, nämlich das serilisierte wie oben beschrieben, erwartet und ein Objekt zurück gibt. Das Problem? Hier muss man dann selbst — quasi manuell — die einzelnen Dict-Values in Objekte wandeln.
Das ganze könnte dann ungefähr so aussehen:

main.py

from human import human
import json

json_string = '{"name" : "Stefan", "age" : 24, "location" : "Top Secret", "nickname" : "StefMa"}'

human_object = json.loads(json_string, object_hook=human.createHuman)

human.py

class human():
def __init__(self):
self.name = ""
self.age = 0
self.location = ""
self.nickname = ""

@staticmethod
def createHuman(json_dict):
h = human()
h.name = json_dict["name"]
h.age = json_dict["age"]
h.location = json_dict["location"]
h.nickname = json_dict["nickname"]
return h

Ja ich weiß, Python ist nicht Java. Allerdings sind Objekte in der OOP immer gut. Ergibt ja auch sinn ;). Schade dass bei Python — oder ich habe noch nichts gefunden — es nicht eine ähnlich einfache Lib wie Gson gibt, die das Parsing für einen übernimmt.

--

--