5

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

我用 C# 编写了一个 JSON 序列化/反序列化类JavaScriptSerializer

    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 序列化/反序列化类。我试过flexjsongoogle-gson但我不知道如何在 Java 中指定 <T> 。

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

4

3 回答 3

9

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

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

但这通常只是反序列化所需要的;序列化时,您有一个带有库可以使用的类的实例。

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

于 2010-11-19T15:52:11.937 回答
1

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

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

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

于 2010-11-19T10:43:04.420 回答
-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);
    }
}
于 2010-11-19T09:45:08.887 回答