Java JSON-Serialisierung – Best Practice

Ich muss JSON Serialisierung für einige Objekte implementieren, und ich habe ein Problem bei der Integration mit generischen Sammlungen aufgetreten.

Alle serialisierbaren classn implementieren diese Schnittstelle (JSONObject stammt aus dieser Bibliothek):

interface JSONSerializable{ public JSONObject dump() throws JSONException //serializes object public void load(JSONObject obj) throws JSONException //deserializes object } 

Code für meine Sammlung basierend auf java.util.list sieht mehr oder weniger so aus:

 class AwesomeList implements JSONSerializable{ private LinkedList items = new LinkedList(); ... ... public JSONObject dump() throws JSONException { JSONObject result = new JSONObject(); JSONArray a = new JSONArray(); for(T i : items){ a.put(i.dump()); } result.put("items", a); return result; } public void load(JSONObject obj) throws JSONException{ //here is my problem } } 

Mein Problem ist: Wenn ich AwesomeList von JSONObject lade, muss ich seine Elemente erstellen, aber es ist unmöglich, da Java mir das Schreiben verbietet

 T newItem = new T(); newItem.load(obj); 

Wie soll ich meinen Ansatz für diese Aufgabe ändern?

   

Bist du mit dieser Bibliothek verbunden? Google Gson ist sehr beliebt. Ich habe es selbst nicht mit Generics verwendet, aber auf der Titelseite steht, dass Gson die Unterstützung von Generika für sehr wichtig hält.

Wie andere angedeutet haben, sollten Sie in Erwägung ziehen, die Bibliothek von org.json zu löschen. Es ist heutzutage ziemlich überholt und der Versuch, seine Probleme zu umgehen, ist Zeitverschwendung.

Aber zu spezifischer Frage; type variable T hat einfach keine Informationen, die Ihnen helfen können, da es sich um wenig mehr als Kompilierzeit handelt. Stattdessen müssen Sie die tatsächliche class übergeben (als ‘Class cls’-Argument), und Sie können dann eine Instanz mit’ cls.newInstance () ‘erstellen.

Haben Sie versucht, json-io ( https://github.com/jdereg/json-io )?

Mit dieser Bibliothek können Sie jeden Java-Objektgraphen serialisieren / deserialisieren, einschließlich Objektgraphen mit Zyklen in ihnen (z. B. A-> B, B-> A). Es erfordert nicht, dass Ihre classn eine bestimmte Schnittstelle implementieren oder von einer bestimmten Java-class erben.

Zusätzlich zur Serialisierung von Java zu JSON (und JSON zu Java) können Sie JSON mit diesem Format formatieren (schön drucken):

 String niceFormattedJson = JsonWriter.formatJson(jsonString) 

Nun, wenn Sie es in eine Datei schreiben, wissen Sie, welche class T ist, also können Sie diese im dump speichern. Wenn Sie es dann wieder einlesen, können Sie es dynamisch durch reflection aufrufen.

 public JSONObject dump() throws JSONException { JSONObject result = new JSONObject(); JSONArray a = new JSONArray(); for(T i : items){ a.put(i.dump()); // inside this i.dump(), store "class-name" } result.put("items", a); return result; } public void load(JSONObject obj) throws JSONException { JSONArray arrayItems = obj.getJSONArray("items"); for (int i = 0; i < arrayItems.length(); i++) { JSONObject item = arrayItems.getJSONObject(i); String className = item.getString("class-name"); try { Class clazzy = Class.forName(className); T newItem = (T) clazzy.newInstance(); newItem.load(obj); items.add(newItem); } catch (InstantiationException e) { // whatever } catch (IllegalAccessException e) { // whatever } catch (ClassNotFoundException e) { // whatever } }