Gson:如何使用gson将json对象转换为子类对象

问题描述:

我使用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

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