Serialização JSON Java-best practice

Eu preciso implementar a serialização JSON para alguns objetos, e eu encontrei um problema quando se trata de integração com coleções genéricas.

todas as classes serializáveis implementam esta interface (o JSONObject vem de Esta biblioteca):

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

código para a minha colecção baseado em java.util.a lista parece-se mais ou menos com isto:

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

o meu problema é: quando carrego a AwesomeList do JSONObject, preciso de criar os seus elementos, mas é impossível desde java proíbe-me de escrever.

T newItem = new T();
newItem.load(obj);
Como devo modificar a minha abordagem a esta tarefa?

Author: KCH, 2011-09-24

4 answers

Estás ligado a esta biblioteca? O Google Gson é muito popular. Eu próprio não o usei com genéricos, mas a primeira página diz que o Gson considera o apoio aos genéricos muito importante.
 31
Author: Miserable Variable, 2016-04-20 13:58:43
Como outros sugeriram, devias considerar a hipótese de despejar a org.a biblioteca do json. É muito obsoleto hoje em dia, e tentar resolver os seus problemas é uma perda de tempo.

Mas para uma questão específica; a variável Tipo T simplesmente não tem qualquer informação para o ajudar, uma vez que é pouco mais do que informação de tempo de compilação. Em vez disso, você precisa passar a classe real (como argumento CLS de classe), e você pode então criar uma instância com cls.newInstance ()".

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

Já tentaste o json-io ( https://github.com/jdereg/json-io)?

Esta biblioteca permite-lhe serializar / deserializar qualquer grafo de Objecto Java, incluindo grafos de objectos com ciclos neles (por exemplo, A->B, B - >a). Ele não requer que suas aulas implementem qualquer interface em particular ou herdem de qualquer classe Java em particular.

Além da serialização de Java para JSON (e JSON para Java), você pode usá-lo para formatar (pretty print) JSON:

String niceFormattedJson = JsonWriter.formatJson(jsonString)
 1
Author: John DeRegnaucourt, 2014-02-24 18:32:15
Bem, ao escrevê-lo para Ficheiro, sabe o que é classe T, por isso pode guardar isso em dump. Então, ao lê-lo de volta, você pode chamá-lo dinamicamente usando reflexão.
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