GWT JSON von php Seite laden und parsen
Es ist alles so weit, das wir nun Daten aus der Datenbank brauchen um dynamischen Inhalt zu erstellen. Diese Daten bekommen wir über JSON Objekte. Das sind nur Strings die man bei PHP ganz einfach mit json_encode und json_decode behandeln kann. Da schiebt man ganze Objekte oder arrays rein und kann sie als String verschicken.
Dies ist das Resultat meiner ersten Versuche JSON mit dem GWT zu parsen und zu nutzen. Im späteren Einsatz werden wir extra Javaobjekte haben, welche sich um die Datenbeschaffung und Aktualisierung kümmern.
Die php Seite
Ich habe mir eine kleine PHP Seite gebaut, welche eine Datenbankanfrage macht. Für die Datenbank Kommunikation nutze ich ADODB.
Die ausgabe der PHP Seite ist im Wesentlichen nur der Aufruf dieser Klasse:
class sensors {
var $sensor = array();
function __construct($DB) {
$rs = $DB->Execute('SELECT id, name FROM nodes');
while (!$rs->EOF) {
$this->sensor[] = $rs->fields;
$rs->MoveNext();
}
}
}
JSON string parsen
Ich ziehe das mal vor, da es der schwierigste bzw. komplexeste Teil ist. Wir parsen erstmal einen statischen JSON string und anschließend nutzen wir dann den http request um diesen String vom Server zu bekommen. So kann man testen, ohne den Server die ganze Zeit zu belasten. Das spart viel Wartezeit
Problem:
[ERROR] Line 8: The import com.google.gwt.json cannot be resolved
Lösung:
Damit ihr die json libary aus dem GWT nutzen könnt muss folgende Zeile in die *.gwt.xml Datei:
<inherits name='com.google.gwt.json.JSON' />
Der JSON String der später von unserem php Script ausgegeben wird lautet:
{"sensor":[{"id":"1","name":"Mensa"},{"id":"2","name":"FSR"},{"id":"3","name":"Audimax I"},{"id":"4","name":"TI5"}]}
So kann man diesen String parsen und kommt an die namen der Sensoren. Ich habe mit den Namen dann Einträge in meinem Treeview erstellt. Aber das lässt sich beliebig ändern.
Im Prinzip geht man sein JSON Objekt von aussen nach innen durch und definiert selbst wie die teile aussehen. Das geht über die Funktionen .isArray() oder isString(), etc…
JSONArray, JSONObject, .. sind alle kompatibel und lassen sich beliebig rum casten. Es handelt sich eigentlich ja nur um Strings, welche wir hier in diese Helferklassen gepackt haben.
//Für JSON:
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
...
String json = "{\"sensor\":[{\"id\":\"1\",\"name\":\"Mensa\"},{\"id\":\"2\",\"name\":\"FSR\"},{\"id\":\"3\",\"name\":\"Audimax I\"},{\"id\":\"4\",\"name\":\"TI5\"}]}";
JSONObject jsonObj = (JSONObject)JSONParser.parse(json);
if (jsonObj.containsKey("sensor")) {
JSONArray jsonSensors = jsonObj.get("sensor").isArray();
if (jsonSensors.isArray() != null) { //Working on sensor variable, should not be null
int count = jsonSensors.size();
//MessageBox.alert(String.valueOf(jsonSensors.size()));
for (int i= 0; i < count; i ++) {
JSONObject sensor = (JSONObject)jsonSensors.get(i);
if (sensor.isObject() != null) { //Sensor exists
//try to find name and id
if (sensor.containsKey("name")) { //Yea we have a name in: Sensor[i].name
JSONString sensorName = (JSONString)sensor.get("name").isString(); //handle the name property as String
sensorsNode.appendChild(new TreeNode(sensorName.stringValue())); //Create node with stringValue of the JSONString
}
}
}
}
}
Ich habe den String in die variable json geschrieben, normalerweise bekommt ihr den String aus einer response:
public void onResponseReceived(Request request, Response response) {
String json = response.getText();
...
}
HTTP Request
Aber mal von vorne, wie rufe ich jetzt die PHP seite ab?
Dafür brauch unsere Javaklasse folgende includes:
import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.Response;
Sie muss ausserdem RequestCallback implementieren. Das sieht bei mir so aus:
public class TreeComponent extends TreePanel implements RequestCallback {
...
public void onError(Request request, Throwable exception) {
MessageBox.alert("Error: " + exception.toString());
}
public void onResponseReceived(Request request, Response response) {
MessageBox.alert("Response: " + exception.toString());
}
}
Um den Aufruf aus zu führen schrieben wir folgendes:
RequestBuilder request = new RequestBuilder(RequestBuilder.GET, "http://www.youdomain.de/yourpathto/index.php?obj=sensors");
try {
request.sendRequest("", this);
} catch (Exception ex) {
MessageBox.alert(ex.toString());
}
Leave a Reply
Kategorien
- Allgemein (1)
- Alltag (2)
- Grafik & Animation (14)
- Indien (4)
- Projekte (6)
- Dieser Blog (1)
- SensorFrontend (2)
- Server (4)
- Uncategorized (1)
- Web Developement (6)
- GWT (3)
- Webanwendungen (2)