Serializzazione Java JSON: best practice

Ho bisogno di implementare la serializzazione JSON per alcuni oggetti, e ho riscontrato un problema quando si trattava di integrazione con collezioni generiche.

Tutte le classi serializzabili implementano questa interfaccia (JSONObject proviene da questa libreria):

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

Il codice per la mia raccolta basata su java.util.list ha un aspetto più o meno simile a questo:

 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 } } 

Il mio problema è: quando carico AwesomeList da JSONObject, devo creare i suoi elementi ma è imansible dal momento che java mi impedisce di scrivere

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

Come dovrei modificare il mio approccio a questa attività?

Sei legato a questa libreria? Google Gson è molto popolare. Non ho usato me stesso con Generics ma la loro prima pagina dice che Gson considera il supporto per Generics molto importante.

Come altri hanno suggerito, dovresti prendere in considerazione la libreria di dumping di org.json. Oggigiorno è praticamente obsoleto e cercare di aggirare i suoi problemi è una perdita di tempo.

Ma a una domanda specifica; digitare la variabile T non ha alcuna informazione per aiutarti, dato che è poco più di informazioni in fase di compilazione. Invece è necessario passare la class effettiva (come argomento ‘Class cls’), e quindi è ansible creare un’istanza con ‘cls.newInstance ()’.

Hai provato il tuo json-io ( https://github.com/jdereg/json-io )?

Questa libreria consente di serializzare / deserializzare qualsiasi grafico di oggetti Java, compresi i grafici degli oggetti con cicli in essi (ad es. A-> B, B-> A). Non richiede che le tue classi implementino una particolare interfaccia o ereditino da una particolare class Java.

Oltre alla serializzazione di Java in JSON (e JSON in Java), puoi usarlo per formattare (pretty print) JSON:

 String niceFormattedJson = JsonWriter.formatJson(jsonString) 

Bene, quando lo scrivi in ​​un file, sai cosa è la class T, quindi puoi salvarlo in dump . Quindi, rileggendolo, puoi chiamarlo dynamicmente usando la reflection.

 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 } }