2013-09-02 3 views
5

gson ist solch ein großes serialize/deserialization Werkzeug. Mit der toJson-Funktion ist es sehr einfach, eine JSON-Darstellung eines beliebigen Objekts zu erhalten.gson: Funktionsergebnis zu einem Objekt hinzufügen, das von toJson() erstellt wurde

Jetzt möchte ich die Daten meines Objekts an den Browser senden, um in Javascript/jQuery verwendet zu werden. So, ich brauche ein zusätzliches JSON Element definiert, die dom Klasse des Objekts, die in meinem Objekt als dynamisches/memberless Funktion codiert

public String buildDomClass() 

Wie diese Zeichenfolge an meinem String durch die toJson Funktion erstellt hinzufügen?

Irgendwelche Ideen?

Vielen Dank

Antwort

2

Eine einfache Möglichkeit ist es, eine TypeAdapterFactory und eine Schnittstelle zu verbinden.

Zuerst wird eine Schnittstelle für Ihre Methode:

public interface MyInterface { 
    public String buildDomClass(); 
    } 

dann die Fabrik:

final class MyAdapter implements TypeAdapterFactory { 

    @Override 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType) { 
    final TypeAdapter<T> adapter = gson.getDelegateAdapter(this, tokenType); 

    return new TypeAdapter<T>() { 
     @Override 
     public T read(JsonReader reader) throws IOException { 
     return adapter.read(reader); 
     } 

     @Override 
     public void write(JsonWriter writer, T value) throws IOException { 
     JsonElement tree = adapter.toJsonTree(value); 

     if (value instanceof MyInterface) { 
      String dom = ((MyInterface) value).buildDomClass(); 
      JsonObject jo = (JsonObject) tree; 
      jo.addProperty("dom", dom); 
     } 

     gson.getAdapter(JsonElement.class).write(writer, tree); 
     } 
    }; 
    } 
} 

Leicht zu verstehen, wenn das Objekt die Schnittstelle implementieren serialisieren möchten, können Sie die Serialisierung delegieren, und dann fügen Sie eine zusätzliche Eigenschaft hinzu, die Sie DOM enthält.

Falls Sie nicht wissen, registrieren Sie ein Werk wie dieses

Gson gson = new GsonBuilder().registerTypeAdapterFactory(new MyAdapter()).create(); 
+0

große Antwort, vielen Dank! –

Verwandte Themen