JSON使用google-gson序列化/反序列化泛型类型

时间:2010-11-17 02:43:58

标签: java json serialization gson deserialization

好吧,我必须承认我不擅长Java中的泛型类型

我使用JavaScriptSerializer

在C#中编写了一个JSON序列化/反序列化类
    private static JavaScriptSerializer js = new JavaScriptSerializer();

    public static T LoadFromJSONString<T>(string strRequest)
    {
        return js.Deserialize<T>(strRequest);
    }

    public static string DumpToJSONString<T>(T rq)
    {
        return js.Serialize(rq);
    }

它在C#中运行良好。现在我正在尝试转换或至少在Java中编写另一个JSON序列化/反序列化类。我尝试过 flexjson google-gson ,但我不知道如何指定&lt; T&gt;在Java。

有人可以帮助我吗?顺便说一句,我更喜欢 google-gson

3 个答案:

答案 0 :(得分:9)

在Java中,您必须传递实际类型擦除的类,而不仅仅是类型参数,因此数据绑定器知道要使用的类型;所以像:

public static T LoadFromJSONString<T>(string strRequest, Class<T> type)
{
    Gson gson = new Gson();
    return gson.fromJson(strRequest, type);
}

但通常只需要反序列化;在序列化时,你有一个具有库可以使用的类的实例。

顺便说一句,您可能要考虑使用的另一个优秀的Java JSON库是Jackson;但是,对于这个特定的例子,你提到的所有库都可以工作。

答案 1 :(得分:1)

经过深思熟虑之后,我认为没有办法像在C#代码中那样解决这个问题。这是因为java编译器完成了类型擦除。

最好的解决方案可能是在您知道需要序列化/反序列化的对象类型的位置使用Gson对象。

如果你不是每次都热衷于制作Gson对象的实例,你当然至少可以保持一个静态,因为它在创建时不需要任何类型参数。

答案 2 :(得分:-1)

这应该有效:

import com.google.gson.Gson;
public class GenericClass {

    private static Gson gson = new Gson(); 

    public static <T> T loadFromJSONString(String strRequest)
    {
        return (T) gson.fromJson(strRequest, T.class);
    }

    public static <T> String dumpToJSONString(T rq)
    {
        return gson.toJson(rq);
    }
}