Sérialisation Java JSON-meilleures pratiques


J'ai besoin d'implémenter la sérialisation JSON pour certains objets, et j'ai rencontré un problème en ce qui concerne l'intégration avec les collections génériques.

Toutes les classes sérialisables implémentent cette interface (JSONObject provient de cette bibliothèque ):

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

Code pour ma collection basée sur java.util.la liste ressemble plus ou moins à ceci:

class AwesomeList<T extends JSONSerializable> implements JSONSerializable{
    private LinkedList<T> items = new LinkedList<T>();
    ...
    ...

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

Mon problème est: Lorsque je charge AwesomeList à partir de JSONObject, j'ai besoin de créer ses éléments mais c'est impossible car java interdit moi d'écrire

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

Comment dois-je modifier mon approche de cette tâche?

Author: KCH, 2011-09-24

4 answers

Êtes-vous lié à cette bibliothèque? Google Gson est très populaire. Je ne l'ai moi-même pas utilisé avec des génériques, mais leur première page dit que Gson considère le soutien aux génériques très important.

 31
Author: Miserable Variable, 2016-04-20 13:58:43

Comme d'autres l'ont laissé entendre, vous devriez envisager de vider org.json de la bibliothèque. Il est à peu près obsolète de nos jours, et essayer de contourner ses problèmes est une perte de temps.

Mais à une question spécifique; la variable de type T n'a tout simplement aucune information pour vous aider, car ce n'est guère plus que des informations de compilation. Au lieu de cela, vous devez passer la classe réelle (en tant qu'argument' Class cls'), et vous pouvez ensuite créer une instance avec ' cls.newInstance ()".

 4
Author: StaxMan, 2011-10-01 23:46:46

Avez-vous essayé json-io (https://github.com/jdereg/json-io)?

Cette bibliothèque vous permet de sérialiser / désérialiser n'importe quel graphique d'objet Java, y compris les graphiques d'objet avec des cycles (par exemple, A->B, B->A). Il ne nécessite pas que vos classes implémentent une interface particulière ou héritent d'une classe Java particulière.

En plus de la sérialisation de Java en JSON (et JSON en Java), vous pouvez l'utiliser pour formater (jolie impression) JSON:

String niceFormattedJson = JsonWriter.formatJson(jsonString)
 1
Author: John DeRegnaucourt, 2014-02-24 18:32:15

Eh bien, lorsque vous l'écrivez dans un fichier, vous savez quelle est la classe T, vous pouvez donc la stocker dans dump. Ensuite, lorsque vous le relisez, vous pouvez l'appeler dynamiquement en utilisant la réflexion.

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
        }
    }
 0
Author: mangoDrunk, 2011-09-24 16:29:49