繁体   English   中英

Gson:如何使用gson将json对象隐蔽到子类对象

[英]Gson : How to covert json object to child class object using gson

我正在使用gson将json字符串转换为java对象。 在我的应用程序中,我正在创建一个具有子类的抽象类。 这是我的课程结构。 在此处输入图片说明

在这种情况下,我想使用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对象。 我知道,我想念什么。 所以,您能找出我应该在哪里做错吗?

Gson可用于序列化/反序列化

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM