JSON Datensätze aus Website in Tabelle

manniL|

Mitglied
Heyho 😉

ich wollte euch ein paar Sachen fragen:

Es geht darum, dass ich JSON-Datensätze von einer Website (Reine Textdaten) in eine JTable o.Ä. übernehmen möchte. Leider habe ich keinen Codeansatz, da ich mich noch nie mit JSON beschäftigt hab.

Ein JSON-Datensatz sieht ungefähr so aus:

Code:
{"eg_transactionid":"000000","eg_from":"0000","eg_fromusername":NAME,"eg_to":"00000","eg_tousername":"Name","amount":"00000","note":"Notiz","dateline":"1303586207"},
 
Ok du beschreibst zwei verschiedene Dinge, wobei hast du jetzt konkret Probleme? Beim Einlesen des Json-Strings?
Ich würde google Gson empfehlen. Schreibe dir entsprechende Java Klassen!
Wie sieht denn dein Json-String genau aus? Hast du ein Array von den Datensätzen/Objekten unten? Also in etwa [{....},{...}] , wobei ... = dein Datensatz von oben?
Dann würde/könnte mit Gson das Ganze in etwa so aussehen
Java:
class Entity{
	private String eg_transactionid, eg_from, eg_fromusername, eg_to, eg_tousername,amount,note,dateline;

//getter+setter hier....

Java:
		Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
		List<Entity> gson = new Gson().fromJson(gsonString, collectionType );

Dann hättest du schon eine Liste von Entity-Objekten. :toll:
Nun kämen wir zu dem zweiten Part, nämlich diese Liste in einer JTable anzuzeigen. Da du oben ja eh schon eine Art JavaBean hättest, könnte man sich überlegen das BeanTableModel zu benutzen und diesem einfach deine Liste zu übergeben, dann wäre auch das in ein-zwei Codezeilen abgefrühstückt, oder du musst eben ein anderes Model benutzen/oder gar ein eigenes schreiben.
 
Ok du beschreibst zwei verschiedene Dinge, wobei hast du jetzt konkret Probleme? Beim Einlesen des Json-Strings?
Ich würde google Gson empfehlen. Schreibe dir entsprechende Java Klassen!
Wie sieht denn dein Json-String genau aus? Hast du ein Array von den Datensätzen/Objekten unten? Also in etwa [{....},{...}] , wobei ... = dein Datensatz von oben?
Dann würde/könnte mit Gson das Ganze in etwa so aussehen
Java:
class Entity{
	private String eg_transactionid, eg_from, eg_fromusername, eg_to, eg_tousername,amount,note,dateline;

//getter+setter hier....

Java:
		Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
		List<Entity> gson = new Gson().fromJson(gsonString, collectionType );

Dann hättest du schon eine Liste von Entity-Objekten. :toll:
Nun kämen wir zu dem zweiten Part, nämlich diese Liste in einer JTable anzuzeigen. Da du oben ja eh schon eine Art JavaBean hättest, könnte man sich überlegen das BeanTableModel zu benutzen und diesem einfach deine Liste zu übergeben, dann wäre auch das in ein-zwei Codezeilen abgefrühstückt, oder du musst eben ein anderes Model benutzen/oder gar ein eigenes schreiben.

Genau so siehts aus.

Ich werde das ganze mal mit GSON probieren 😉

Danke dir 🙂

Wenns etwas neues gibt, melde ich mich.
 
Java:
     Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
        List<Entity> gson = new Gson().fromJson(gsonString, collectionType );

gsonString cannot be resolved to a variable

:/
 
Naja mit gsonString meinte ich eben deinen Datensatz! Den musst du natürlich vorher von irgendwo herholen 😀

Also z.B. dass du hast:
Java:
String gsonString ="[{"eg_transactionid":"000000","eg_from":"0000","eg_fromusername":NAME,"eg_to":"00000","eg_tousername":"Name","amount":"00000","note":"Notiz","dateline":"1303586207"},{...}]";

(die Anführungszeichen natürlich maskieren, aber du bekommst den ja eh von wo anders 😀!)

Bzw du kannst dort auch direkt einen Reader angeben, also z.B.
new InputStreamReader(new URL("URL DEINER WEBSEITE").openStream())
 
Ich habe mich mal daran probiert, die Daten aus der Website auslesen zu lassen und die Konsole printen zu lassen, leider ohne Erfolg :/

Java:
public static void main(String[] args) throws IOException{
JSONcheck();
	}
	
	
	public static void JSONcheck() throws IOException{
		
	    
	     String mn ="ZAHL";
	     String sw = "WORT";
		 String webnames = "ULR" + mn + "&type=all&secretword=" +sw ;
	     URL url = new URL(webnames);

	     URLConnection urlc = url.openConnection();

	     //BufferedInputStream buffer = new BufferedInputStream(urlc.getInputStream());
	     BufferedReader buffer = new BufferedReader(new InputStreamReader(urlc.getInputStream(), "UTF8"));

	     StringBuilder builder = new StringBuilder();

	     int byteRead;{

	     try {
			while ((byteRead = buffer.read()) != -1)
			     builder.append((char) byteRead);
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	     
	     String gsonString=builder.toString();

	     System.out.println(gsonString);


	     try {
			buffer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Hat alles geklappt, hatte nen Fehler bei der Website 😀
 
Zuletzt bearbeitet:
Heyho, also, ich habe porbiert das ganze per BeanTableModel daarzustellen, bekomme aber eine Errormeldung.

Error:
Java:
java.lang.NullPointerException
	at org.icroco.tablemodel.impl.BeanTableModel.getColumnCount(BeanTableModel.java:402)
	at javax.swing.JTable.createDefaultColumnsFromModel(Unknown Source)
	at javax.swing.JTable.tableChanged(Unknown Source)
	at javax.swing.JTable.setModel(Unknown Source)
	at javax.swing.JTable.<init>(Unknown Source)
	at javax.swing.JTable.<init>(Unknown Source)
	at src.GUI.initGUI(GUI.java:128)
	at src.GUI.<init>(GUI.java:98)
	at src.GUI$1.run(GUI.java:88)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Zuletzt bearbeitet:
Zeige doch mal deinen aktuellen Code.

ps.: Wieso hast du das eig. so kompliziert gemacht mit dme StringBuilder + BufferedReader etc ? 😀
Kannst doch bei Gson direkt den Reader übergeben -> er gibt dir die Liste zurück. DIe kannste dann ins BeanTableModel setzen!
 
Zeige doch mal deinen aktuellen Code.

ps.: Wieso hast du das eig. so kompliziert gemacht mit dme StringBuilder + BufferedReader etc ? 😀
Kannst doch bei Gson direkt den Reader übergeben -> er gibt dir die Liste zurück. DIe kannste dann ins BeanTableModel setzen!

Das kann sein ^^ Leider kenn ich mich im Bereich HTTP Abfragen us. nicht aus.

Das ganze sieht so aus:
Entity.class
Java:
class Entity{
	private String eg_transactionid, eg_from, eg_fromusername, eg_to, eg_tousername,amount,note,dateline;	
	public static void JSONcheck() throws IOException{
		
	    
	     String mn =".......";
	     String sw = ".......";
		 String webnames = "........" + mn + "......" +sw ;
	     URL url = new URL(webnames);

	     URLConnection urlc = url.openConnection();

	     //BufferedInputStream buffer = new BufferedInputStream(urlc.getInputStream());
	     BufferedReader buffer = new BufferedReader(new InputStreamReader(urlc.getInputStream()));

	     StringBuilder builder = new StringBuilder();

	     int byteRead;{

	     try {
			while ((byteRead = buffer.read()) != -1)
			     builder.append((char) byteRead);
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	     
	     String gsonString=builder.toString();

	     System.out.print(gsonString);


	     try {
			buffer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	     
	    
	    Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
	    List<Entity> gson = new Gson().fromJson(gsonString, collectionType);


	     }
	     }
	
}

GUI.class
Java:
BeanTableModel<Entity> model = new BeanTableModel<Entity>(Entity.class);
					jTable1 = new JTable(model);
					GroupLayout jTable1Layout = new GroupLayout((JComponent)jTable1);
					jTable1.setLayout(jTable1Layout);
					jTable1Layout.setVerticalGroup(jTable1Layout.createSequentialGroup());
					jTable1Layout.setHorizontalGroup(jTable1Layout.createSequentialGroup());
				}
Codeausschnitt.


Leider kommt eine NullPointerException:

Java:
java.lang.NullPointerException
	at org.icroco.tablemodel.impl.BeanTableModel.getColumnCount(BeanTableModel.java:402)
	at javax.swing.JTable.createDefaultColumnsFromModel(Unknown Source)
	at javax.swing.JTable.tableChanged(Unknown Source)
	at javax.swing.JTable.setModel(Unknown Source)
	at javax.swing.JTable.<init>(Unknown Source)
	at javax.swing.JTable.<init>(Unknown Source)
	at src.GUI.initGUI(GUI.java:128)
	at src.GUI.<init>(GUI.java:98)
	at src.GUI$1.run(GUI.java:88)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.awt.EventQueue$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Uff, ich weiss gar nicht wo ich anfangen soll 😀

at org.icroco.tablemodel.impl.BeanTableModel <-- hatte ich nicht zu diesem BeanTableModel verlinkt :autsch:😛ueh: ? Das sind nur zwei Java Dateien die man sich ziehen muss. Dort im Konstruktor kannst du dann auch direkt deine Liste mitgeben!

Ansonsten macht dein Code wenig Sinn! Man sieht weder wo JSONcheck() überhaupt aufgerufen wird, noch macht die Methode so an sich überhaupt Sinn!

List<Entity> gson <-- diese würde ich zurückgeben, anstelle von void 😀 Oder eben zumindest einen getter schreiben (diese Liste dann eben dem BeanTableModel übergeben)

"Das kann sein ^^ Leider kenn ich mich im Bereich HTTP Abfragen us. nicht aus."

Naja aber ich schrieb doch schon dass du der Methode von Gson auch einen Reader übergeben kannst,. Das kannste StringBuilder gedöns tund manuelle auslesen mit read kannst du sein lassen:

Java:
 Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
        List<Entity> gson = new Gson().fromJson(new InputStreamReader(urlc.getInputStream()), collectionType);
reicht völlig 😀
 
Bei dem verlinkten TableModel kann ich aber, außer den .java Dateien, nix downloaden, also keine lib. Oder brauche ich keine Lib?

JSONcheck() war nur zum Test, sollte dann eh wieder deleted werden 😀


List<Entity> gson <-- diese würde ich zurückgeben, anstelle von void Oder eben zumindest einen getter schreiben (diese Liste dann eben dem BeanTableModel übergeben)

Wie meinen?
 
Bei dem verlinkten TableModel kann ich aber, außer den .java Dateien, nix downloaden, also keine lib. Oder brauche ich keine Lib?
Nein, nur die zwei Java-Dateien, das schrieb ich doch auch bereits.....


🙁 Naja in deiner Methode JsonCheck hast du doch eine Liste von Entities dann, die du durch gson erhältst. Diese Liste muss ja jetzt nun irgendwie in dein TableModel rein, also brauchst du Zugriff auf diese. In deiner jetzigen Methode bietest du aber keine Möglichkeit dafür an sondern erstellst einfach ein leeres BeanTableModel, das reicht natürlich nicht.
Die Liste kannst du dem Konstruktor des Models übergeben (aber wie jetzt schon paar mal beschrieben, brauchst du eben dafür Zugriff auf diese Liste!!)
 
Naja in deiner Methode JsonCheck hast du doch eine Liste von Entities dann, die du durch gson erhältst.

Ja

Diese Liste muss ja jetzt nun irgendwie in dein TableModel rein, also brauchst du Zugriff auf diese. In deiner jetzigen Methode bietest du aber keine Möglichkeit dafür an sondern erstellst einfach ein leeres BeanTableModel, das reicht natürlich nicht.



Die Liste kannst du dem Konstruktor des Models übergeben (aber wie jetzt schon paar mal beschrieben, brauchst du eben dafür Zugriff auf diese Liste!!)


Aber wie soll ich Zugriff auf die Liste bekommen?
 
Kann es sein dass dir grobe Grundlagen fehlen?
Ich schrieb doch bereits, mache deine Methode nicht void sondern eben List<Entity> als Rückgabewert. Oder keine Ahnung, ein Objekt Parser der dann die Liste als Instanzvariable hält mit einem getter? Kann man so jetzt nicht sagen, kenne dein Konzept ja nicht.
 
Kann es sein dass dir grobe Grundlagen fehlen?
Ich schrieb doch bereits, mache deine Methode nicht void sondern eben List<Entity> als Rückgabewert. Oder keine Ahnung, ein Objekt Parser der dann die Liste als Instanzvariable hält mit einem getter? Kann man so jetzt nicht sagen, kenne dein Konzept ja nicht.

Ja, das kann sein.

Ich möchte eigentlich nur die JSON-Datensätze geordnet in einer Tabelle. Die Columbezeichnungen sollen etwas abgeändert werden, aber mehr brauche ich nicht.


ID|Name|Beispieltext
Datensatz 1->ID|Datensatz1>Name|Datensatz 1 -> BSPText|
Datensatz2|||
usw.
 
Zuletzt bearbeitet:
Ja geht alles so wie oben beschrieben 🙂
Wir kommen so nicht weiter, entweder du liest nicht was ich schreibe, oder du verstehst es nicht, aber dann musst du es sagen wo es Probleme gibt. Und Code zeigen wäre sicherlich auch nicht verkehrt! 😱
 
Ja geht alles so wie oben beschrieben 🙂
Wir kommen so nicht weiter, entweder du liest nicht was ich schreibe, oder du verstehst es nicht, aber dann musst du es sagen wo es Probleme gibt. Und Code zeigen wäre sicherlich auch nicht verkehrt! 😱

Okey, ich probiere es einfach mal umzusetzen.

Teilweise habe ich es nicht ganz verstanden ^^, aber ich glaube, da muss ich einfach nochmal die Dokus lesen usw. :rtfm:


Java:
List<Entity> gson <-- diese würde ich zurückgeben
Wie soll ich das anstellen? ???:L

Java:
Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
        List<Entity> gson = new Gson().fromJson(new InputStreamReader(urlc.getInputStream()), collectionType);
<--- Hab ich umgesetzt

Der Jetzige Code:
Entity.class
Java:
package src;

import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.MalformedURLException;
import java.net.URL;

import java.util.Collection;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

class Entity{
	private String eg_transactionid, eg_from, eg_fromusername, eg_to, eg_tousername,amount,note,dateline;	
		
		 check() throws JsonIOException, JsonSyntaxException, MalformedURLException, IOException{
	    
	     String mn ="---";
	     String sw = "--";
		 String webnames = "----";
	     
	    
	    Type collectionType = new TypeToken<Collection<Entity>>(){}.getType();
	    List<Entity> gson = new Gson().fromJson(new InputStreamReader(new URL(webnames).openStream()), collectionType);
	    System.out.println(gson);
	    
			 return gson;
		 }
	     

}

Da muss ich aber check entweder zum Konstruktor machen, oder void setzen (sagt er mir ^^)


GUI.class
Java:
TableModel model = new BeanTableModel(gson);
					jTable1 = new JTable();
					jTable1.setModel(model);

Da muss ich noch einiges ändern... (Ist nur ein Ausschnitt)
 
Zuletzt bearbeitet:
Da muss ich aber check entweder zum Konstruktor machen, oder void setzen (sagt er mir ^^)

Ohje ohje 😀

Wie wäre es denn mit einfach
Code:
public List<Entity> check() throws .....{
(bzw. wieso überhaupt eine Instanzmethode ? ???:L )
->
Code:
public static List<Entity> check() throws .....{
(oder sogar etl. ganz raus aus dieser Klasse)

GUI.class
Java:
TableModel model = new BeanTableModel(gson);
					jTable1 = new JTable();
					jTable1.setModel(model);

Da muss ich noch einiges ändern... (Ist nur ein Ausschnitt)

Naja, ist ja schön und gut der Ausschnitt, aber was ist gson? Wo ist der Aufruf von der check Methode?
Also jetzt schon mit JSON, externen Libs rum zu spielen (und vor allem GUI!) wo du ja offensichtlich nicht mal die Grundlagen beherrschst,.....ich weiß ja nicht 😀 (nicht böse gemeint!)
 

Neue Themen


Zurück
Oben