Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSON使用google gson序列化/反序列化泛型类型_Java_Json_Serialization_Gson_Deserialization - Fatal编程技术网

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

Java JSON使用google gson序列化/反序列化泛型类型,java,json,serialization,gson,deserialization,Java,Json,Serialization,Gson,Deserialization,嗯,我必须承认我不擅长Java中的泛型类型 我使用JavaScriptSerializer private static JavaScriptSerializer js = new JavaScriptSerializer(); public static T LoadFromJSONString<T>(string strRequest) { return js.Deserialize<T>(strRequest); }

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

我使用
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);
    }
private static JavaScriptSerializer js=new JavaScriptSerializer();
公共静态T LoadFromJSONString(字符串strRequest)
{
返回js.Deserialize(strRequest);
}
公共静态字符串DumpToJSONString(trq)
{
返回js.Serialize(rq);
}
它在C#中运行良好。现在,我正在尝试转换或至少编写另一个Java JSON序列化/反序列化类。我试过flexjsongooglegson,但我不知道如何在Java中指定

这里有人能帮我吗?顺便说一句,我更喜欢谷歌gson,这应该可以:

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);
    }
}
import com.google.gson.gson;
公共类泛型类{
私有静态Gson Gson=new Gson();
公共静态T loadFromJSONString(字符串strRequest)
{
return(T)gson.fromJson(strRequest,T.class);
}
公共静态字符串dumpToJSONString(trq)
{
返回gson.toJson(rq);
}
}

仔细考虑后,我认为没有一种方法可以像在C#代码中那样漂亮地解决这个问题。这是因为java编译器执行了类型擦除

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


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

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

public static T LoadFromJSONString<T>(string strRequest, Class<T> type)
{
    Gson gson = new Gson();
    return gson.fromJson(strRequest, type);
}
publicstatict LoadFromJSONString(字符串strequest,类类型)
{
Gson Gson=新的Gson();
返回gson.fromJson(strRequest,type);
}
但这通常只是反序列化所需要的;序列化时,您有一个实例,其中包含库可以使用的类


Hmm,等等。那不行。该行导致问题:return(T)gson.fromJson(strequest,T.class);嗯,但是假设我只有类信息作为字符串,例如
string clazz=“com.example.Response”
,那么我如何使用这些代码呢?您可以使用class.forName(“com.example.Response”)来查找它。是的,我已经尝试过了。但问题是,当我使用
Class.forName()
时,返回类型必须是
Object
,而不是
Response
,我必须这样清楚地说明:
Response rp=(Response)LoadFromJSONString(resString,Class.forName(“com.example.Response”)
,因为Class.forName()返回一个类,你确实需要做一些铸造;但是,虽然丑陋,但这并不妨碍它的工作。接口通常需要类型参数,以便类的显式传递(Response.class的类型为class)与类型参数兼容;但这是一个更好的功能。所以你必须通过绑定到的类;类型参数T不足以让Java计算出实际的类型。