2013-09-02 13 views
5

gson jest tak doskonałym narzędziem serializacji/deserializacji. Bardzo proste jest uzyskanie reprezentacji JSON dowolnego obiektu za pomocą funkcji toJson.gson: Dodaj wynik funkcji do obiektu utworzonego przez toJson()

Teraz chcę wysłać dane mojego obiektu do przeglądarki do użycia w javascript/jQuery. Zatem muszę jeden dodatkowy element JSON Definiowanie klasy dom obiektu, który jest zakodowany w ciągu mojego obiektu w funkcji dynamicznego/memberless

public String buildDomClass() 

Jak dodać ten ciąg do mojego ciąg utworzony przez funkcję toJSON?

Wszelkie pomysły?

Thanks a lot

Odpowiedz

2

Łatwym sposobem jest połączenie TypeAdapterFactory oraz interfejs.

Pierwszy interfejs do swojej metody:

public interface MyInterface { 
    public String buildDomClass(); 
    } 

następnie fabryka:

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

Łatwe do zrozumienia, jeżeli przedmiotem chcesz serializacji implementować interfejs, należy powierzyć szeregowania, i następnie dodajesz dodatkową właściwość z DOM.

W przypadku, gdy nie wiesz, jak zarejestrować fabrykę tej

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

wielką odpowiedź, dzięki dużo! –

Powiązane problemy