Interface JSON Objekte aus Java Objekten erzeugen

Joew0815

Bekanntes Mitglied
Hallo,

ich möchte Java Objekte über einen Socket verschicken. Dazu habe ich einen Parser geschrieben der JSON Nachrichten erstellt und auch wieder parst.

Nun möchte ich ein Interface definieren, das es mir erlaubt alle Objekte die dieses Interface implementieren in JSON Objekte umzuwandeln und aus JSON Objekten wieder zu instanziieren.

Java:
public interface JSONMessageInterface<E> {

    // Das ist soweit klar
    public JSONObject getJSONRepresentation();

    // Hier weiß ich nicht weiter
    public E getObjectFromJSON(JSONObject object);

}

Ich dachte an ein Interface wie das oben beschriebene. Nun habe ich allerdings das Problem, dass ich jedes mal ein Objekt benötige um ein neues Objekt aus einem JSON zu erzeugen. Die eigentlich logische Lösung wäre eine statische Factory Methode, aber das ist so ja nicht erlaubt.

Gibt es eine Möglichkeit Klassen zu zwingen eine statische Methode zu implementieren? Gibt es eine andere schöne Möglichkeit für Objekte eine JSON Repräsentation sowie deren Konvertierung zu implementieren?

Oder sollte ich am Ende doch gson verwenden?
 
Ich verstehe dein Problem mit deinem Ansatz nicht so recht. Wo hakt es?

Aber nein, du kannst eine Klasse nicht zwingen eine statische Methode zu implementieren.
 
Ich verstehe dein Problem mit deinem Ansatz nicht so recht. Wo hakt es?

Angenommen ich habe ein JSONObject. Daraus möchte ich nun ein Auto Objekt erstellen. Das würde dann so funktionieren.

Auto a = new Auto().getObjectFromJSON(jsonObject);

Ich muss also jedes mal ein Objekt instanziieren um das JSONObject parsen zu können, weil die Methode nicht statisch ist.
 
Vllt. ist das interessant für dich. Wenn man es etwas anpasst.

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.Primitives;

public class JSONFileToObject {
	public static <T> T loadFile(String filePath, Class<T> classOfT) {
		
		Gson gson = new Gson();
		Object obj = null;
		try {
	 
			BufferedReader br = new BufferedReader(
				new FileReader(filePath));
	 
			//convert the json string back to object
			obj = gson.fromJson(br, classOfT);
	 
	 
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return Primitives.wrap(classOfT).cast(obj);
	}
	
	public static void writeFile(String filePath, Object obj) {
		try {
			Gson gson = new GsonBuilder().setPrettyPrinting().create();
			String json = gson.toJson(obj);
			
			FileWriter writer = new FileWriter(filePath);
			writer.write(json);
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
Gson kenne ich, ich hätte nur gerne meine eigene JSON Repräsentation der Objekte. Aber so wie ich mir das im Startpost vorgestellt habe, geht das dann wohl nicht?

Trotzdem danke.
 
spricht was dagegen, das die oberste Superklasse einfach von einer Klasse erbt, welche diese Methoden bereitstellt? Natürlich müssten dann aber alle anderen Klassen die ausserhalb der Hierarchie stehen auch davon erben sofern sie diese Methode besitzen sollen 🙂
 
spricht was dagegen, das die oberste Superklasse einfach von einer Klasse erbt, welche diese Methoden bereitstellt? Natürlich müssten dann aber alle anderen Klassen die ausserhalb der Hierarchie stehen auch davon erben sofern sie diese Methode besitzen sollen

Die Methode müsste aber Klassenspezifisch überschrieben werden. Das überschreiben geht bei statischen Methoden ja nicht.

1. Warum machst du sie nicht einfach statisch?
2. Warum machst du das selber? Ich würde da Jackson benutzen.

1. Ich will alle Kindklassen dazu zwingen diese Methode zu implementieren. Jede Klasse braucht ihre eigene Implementierung davon.
2. Weil nicht immer alles was in der Klasse ist auch wirklich relevant ist und ich über das Netzwerk wirklich nur das nötige senden möchte um unnötigen traffic zu vermeiden, da die Anwendung auch über das mobile Netz genutzt werden soll.


Ich habe bereits eine Implementierung mit seperaten Parser Klassen die statische Methoden bereitstellen um die Objekte zu parsen. Ich habe nur gemerkt, dass dies relativ fehleranfällig ist, da es passieren kann dass ich an den Klassen Änderungen mache und diese dann vergesse auf die Parser zu übertragen.
 

Zurück
Oben