JSON Fragen

StefMa

StefMa

Dauergast
450
Hi,

also mein Ziel ist es, dass ich daten von meinem Client auf die App Engine schaufle und auch umgekehrt.
Erstmal habe ich mich mit der App Engine vertraut gemacht.

Da ich keinerlei Ahnung habe von JSON und auch iwie nichts brauchbares finde:
Ich habe mir einfach ein JSON Object angelegt und gebe dieses aus. Ist das richtig?! oO
Die App Engine zeigt dann eine Webseite die so aussieht:
Code:
{"datumstart": "2013-04-24 13:19:38.874390", "datumende": "2013-04-24", "frage": "Gewinnt heute Bayern?"}
{"datumstart": "2013-04-24 13:19:58.333350", "datumende": "2013-04-24", "frage": "Gewinnt Dortmund?"}
In der App würde ich nun die Seite einfach parsen?!

Habe ich die funktionsweise von JSON richtig verstanden?! Das es quasi nur eine "einfache" darstellung von Daten ist?

Wie bekomme ich dann später die Daten AUF die Engine?! Hier sagen ja auch alle JSON. Muss ich dann einfach das JSON-Object meiner Engine geben und diese muss das einfach "entflechten" um entsprechend in die Datenbank schreiben?

Danke und Gruß
 
Ja, das hast Du richtig verstanden.

JSON ist ein Datenformat, dass sehr wenig Overhead hat und gut lesbar ist. Für die meisten Sprachen gibt es Klassen und/oder Libraries, die mit JSON-Strings umgehen können... oder wie Du sagst "entflechten"

Dein Codebeispiel ist übrigens richtig. Sind halt zwei Objekte, die Du da angibst. Beiden enthalten einfache Paare.

Der folgende Link behandelt zwar JSON und Delphi, aber ich fand die JSON-Infos zum Verständnis sehr sehr gut.

SDN > Artikelen > Reading and Writing JSON with Delphi

Ich bin mir sicher, dass die App Engine Dir irgendwas bietet, was JSNO einfach handhabbar macht.

Gruß,
Thomas
 
JSON auf Appseite -> Gson
JSON auf Serverseite -> Gson (weil du das schon von der App her kennst dann) oder Jackson (mächtiger)
 
Hi,

danke euch beiden.
Dann mach ich bisher ja alles richtig :)

Was ist Gson? Die App Engine bietet doch vollen json Support an. Wieso eine extra Libary dafür nutzen? Selbes gilt für Android...

Kann ich den Code, den ich dann via Webseite angezeigt bekomme, iwie "verstecken". Also das nicht jeder das sieht, was dort auf dem Server liegt?!

Gruß
 
Bei der App Engine bin ich mir nicht sicher, aber Android bietet afaik keinen vollen JSON Support.
Das schöne an den libs ist, dass du damit nicht mehr von Hand parst. Du baust dir einfach eine Java Klasse, die so aussieht wie du sie haben willst.

In deinem Fall sowas wie:
Code:
public class Payload {
  java.util.Date datumstart;
  java.util.Date datumende;
  String frage;
}

Gson gibst du dann nur den JSON String und die Klasse und der füllt die komplett für dich. Kein parsen im eigentlich Sinne von Hand mehr.

Typischerweise würde der Server die JSON Antworten nicht als "Startseite" ausgeben. Eigentlich würde die app bei einer bestimmten URL anfragen z.b. InterNetX - Mehr als 300 ccTLDs und gTLDs weltweit registrieren! und dort kommen dann die Fragen zurück. Lies dich mal in REST ein.
 
Jetzt bin ich bisschen verwirrt....

Erst wird gesagt, dass das richtig ist, dass die Webseite mein JSON ausgibt und du sagst jetzt das gegenteil?!

Gruß

P.s. Vielleicht hilft das weiter. vielleicht mache ich auch grade was an der Engine falsch. Der Code dazu http://paste.debian.net/64/
 
Zuletzt bearbeitet:
Nein, ne Webseite existiert da nicht.
JSON ist der reine String. Der wird vom Browser in der Regel angezeigt, da der Server den wahrscheinlich mit 'echo' übergibt. Wenn Du Dir den Quelltext anzeigen lässt, dann siehst Du das.
 
Ich arbeite erst seit gestern mit der App Engine und kenne mich da kaum bis gar nicht aus :D
Habe bisher nur das Tutorial gemacht und eben ein bisschen rum gearbeitet, dass ich gedacht habe "so funktioniert json" :D
App Engine Code hier: debian Pastezone

Wie gesagt, vielleicht mache ich auch auf der Seite schon was falsch. Wahrscheinlich sogar ;)

Gruß

Der ursprüngliche Beitrag von 17:36 Uhr wurde um 17:49 Uhr ergänzt:

Ich hatte nun auch schon versucht mit einer App das auszulesen.
Wenn ich das so mache wie im Code (oben gepastet bei pastebin) bekomme ich bei
Code:
Log.i(TAG, result);
was zurück.

Danach hat es aber dann gescheitert-.-'

Code:
URL urli = new URL(url);
			HttpURLConnection httpURLConnection = (HttpURLConnection) urli
					.openConnection();
			InputStream inputStream = httpURLConnection.getInputStream();
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(inputStream));

			StringBuilder sb = new StringBuilder();
			String temp;
			while ((temp = bufferedReader.readLine()) != null) {
				sb.append(temp);
			}
			String result = sb.toString();
			Log.i(TAG, result);

			JSONObject ob = new JSONObject(result);
			
			JSONArray jsonArray = ob.getJSONArray("frage");
			
			Log.i(TAG+"PENIS", "Number of entries " + jsonArray.length());
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject jsonObject = jsonArray.getJSONObject(i);
				Log.i(TAG+"PENIS 30000", jsonObject.getString("frage"));
			}
 
Den JSON-String, den Du oben angegeben hast, da ist kein Array drin.

Also falls Du die Daten aus dem Beispiel auslesen willst (wovon ich ausgehe, da Du nach "frage" suchst), dann musst Du nach einem JSONPair suchen.

Ich kenne die Klassen nicht, aber nachdem Du das JSONOject erzeugt hast müsste es so was wie JSONPair.get(0) gebe, was Dir dann das erste Wertepaar zurückgibt. Dieses kannst Du wieder nach JSONString und JSONValue auflösen.
 
Stop mal, mache ich erstmal mit der AppEngine alles richtig?
Habe nun schon mehrer "REST/JSON whatever" Seiten angeschaut.
Jedesmal sieht man auf der Webseite den kompletten String. Unr nicht nur im Quelltext!

Z.B.
- https://api-ssl.bitly.com/v3/highvalue?access_token=ACCESS_TOKEN&limit=2
- http://search.twitter.com/search.json?q=android

Gruß

Der ursprüngliche Beitrag von 18:04 Uhr wurde um 18:11 Uhr ergänzt:

Habe mit dem App "Code" ein bisschen gespielt:
Code:
JSONObject ob = new JSONObject(result);
			
			for(int i = 0; i < ob.length(); i += 1) {
				Log.i("sadad", ob.getString("frage"));
			}
Hier gibt er mir 4x die Frage aus. Klar 4x, da ich 4 (Ja wie nennt man das? user, frage, datumende, datumstart) habe. Aber wie komme ich dan das zweite?!

Gruß

Der ursprüngliche Beitrag von 18:11 Uhr wurde um 19:26 Uhr ergänzt:

habe hier auch nun nochmal geschaut:
https://www.googleapis.com/urlshortener/v1/url

Dort bekomme ich ebenfalls nur den text zu sehen...
Oder ist das wirklich Zufall, dass man den JSOn String sieht?!
 
warum machst net ein array ???

jedes "user,frage,datumxxxx" ist dasnn ein object im array. wäre auch der korrektere aufbau
 
Wie wäre in der App dann die abfrage?
Erst JSONArray und dann object abfragen?!

Quasi
Array [
{ user : a, frage : b...}
{ user : x, frage: y }
]

Gesendet von meinem Nexus 4 mit der Android-Hilfe.de App

Der ursprüngliche Beitrag von 19:43 Uhr wurde um 20:37 Uhr ergänzt:

Soo.. "endlich"

Code:
			JSONObject ob = new JSONObject(result);
			JSONArray arNames = ob.getJSONArray("infos");
			
			for(int i = 0; i < arNames.length(); i++){
				JSONObject c = arNames.getJSONObject(i);
				Log.i("name", c.getString("name"));
				Log.i("frage", c.getString("frage"));
			}

Funktioniert bei:
Code:
{ "infos": [ { "name" : "sjürgen", "frage" : "Hallo wie gehts" }, { "name" : "peter", "frage" : "Bayern gewinnt?" } ] }

So hattest du es doch gemeint, oder swordi?

Die Frage ist jetzt nur, wie bekomme ich mit JSON auf der App Engine GENAU dieses format hin?!

Danke und Gruß
 
Hast du dir mal JAXB mit passendem libs angeguckt? Also ich benutze JAXB in Verbindung mit RestEasy...

mfg. Dagobert
 

Ähnliche Themen

M
Antworten
2
Aufrufe
631
Mozart40
M
A
Antworten
1
Aufrufe
585
swa00
swa00
SpeedySix
Antworten
13
Aufrufe
1.404
jogimuc
J
Zurück
Oben Unten