2017-10-05 203 views
1

我使用gson將json字符串轉換爲java對象。在我的應用程序中,我創建了一個具有子類的抽象類。這是我的班級結構。 enter image description hereGson:如何使用gson將json對象轉換爲子類對象

在這種情況下,使用gson我想創建特定的對象。我使用下面的代碼來創建特定的java對象。

GsonBuilder gsonBuilder = new GsonBuilder(); 
       gsonBuilder.registerTypeAdapter(BaseClass.class, new InterfaceAdapter<BaseClass>()); 
       gsonBuilder.setPrettyPrinting(); 
       Gson gson = gsonBuilder.create(); 
    BaseClass baseClass = gson.fromJson(jsonObject.toString(),BaseClass.class); 
// Instead of this I used following function to create particular class object. 

//Optional function 
Class<BaseClass> clazz = (Class<BaseClass>) Class.forName("com.example." + "A"); 
BaseClass baseClass = gson.fromJson(jsonObject.toString(), clazz.getClass()); // This is not working for me 

這裏是我的InterfaceAdapter代碼:

public class InterfaceAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> 
{ 

    @Override 
    public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { 
     JsonObject jsonObject = new JsonObject(); 
     jsonObject.addProperty("type", src.getClass().getName()); 
     jsonObject.add("data", context.serialize(src)); 
     return jsonObject; 
    } 

    @Override 
    public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
    { 
     JsonObject jsonObject = (JsonObject) json; 
     JsonElement jsonTypeElement = get(jsonObject, "type"); 
     JsonElement dataElement = get(jsonObject, "data"); 
     final Type actualType = typeForName(jsonTypeElement); 

     return context.deserialize(dataElement, actualType); 
    } 

    private Type typeForName(final JsonElement typeElem) 
    { 
     try 
     { 
      return Class.forName(typeElem.getAsString()); 
     } 
     catch (ClassNotFoundException e) 
     { 
      throw new JsonParseException(e); 
     } 
    } 


    private JsonElement get(final JsonObject wrapper, final String memberName) 
    { 
     final JsonElement elem = wrapper.get(memberName); 

     if (elem == null) 
     { 
      throw new JsonParseException(
        "no '" + memberName + "' member found in json file."); 
     } 
     return elem; 
    } 
} 

執行程序後,我只拿到了BaseClass的對象。我想創建特定的Java對象,如A,B或C對象。它沒有給我特定的Java對象,我想要的。我知道,我錯過了一些東西。那麼你能找出我該怎麼做的錯誤嗎?

+0

在fromJson()方法中使用A.class或B.class或C.class代替BaseClass.class。 – chandil03

回答

-1

Gson可用於seralize化/反序列

使用GSON序列化對象類:

public String serializeToJson(MyClass myClass) { 
    Gson gson = new Gson(); 
    String j = gson.toJson(myClass); 
    return j; 
} 

使用GSON反序列化到一個對象。

// Deserialize to single object. 
public MyClass deserializeFromJson(String jsonString) { 
    Gson gson = new Gson(); 
    MyClass myClass = gson.fromJson(jsonString, MyClass.class); 
    return myClass; 
}