2010-11-17 19 views
5

Bueno, tengo que confesar que no soy bueno en tipo genérico en JavaJSON Serialize/Deserialize tipo genérico con google-GSON

He escrito una clase JSON serializar/deserializar en C# usando 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); 
    } 

Funciona bien en C#. Ahora estoy intentando convertir, o al menos, escribir otra clase JSON serialize/deserialize en Java. He intentado flexjson y google-gson pero no sé cómo especificar <T> en Java.

¿Podría alguien aquí ayudarme? Por cierto, prefiero google-GSON

Respuesta

9

En Java debe pasar la clase borrada por el tipo real, no solo escribir el parámetro, de modo que los archivadores de datos saben qué tipo usar; algo así como:

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

pero esto solo suele ser necesario para la deserialización; al serializar, tiene una instancia con una clase que las bibliotecas pueden usar.

Btw, otra buena biblioteca Java JSON que puede considerar utilizar es Jackson; sin embargo, para este ejemplo particular, todas las bibliotecas que mencione deberían funcionar.

+0

Hmm, pero supongamos que solo tengo información de clase como cadena, por ejemplo 'String clazz =" com.example.Response "', entonces, ¿cómo puedo usar este código? –

+2

Puede usar Class.forName ("com.example.Response") para encontrarlo. – StaxMan

+0

Sí, ya lo intenté. Pero la cuestión es que, cuando uso 'Class.forName()', el tipo de retorno debe ser 'Object' en lugar de' Response', que debo indicar claramente así: 'Response rp = (Response) LoadFromJSONString (resString , Class.forName ("com.example.Response")) ' –

0

esto debería funcionar:

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); 
    } 
} 
+0

Hmm, espera. Eso no funcionará Esta línea causa problemas: return (T) gson.fromJson (strRequest, T.class); –

+0

igual que mi respuesta, T.class no funciona –

1

Después de pensar esto a través No creo que hay una manera de resolver esto tan bonito como se hace en el código C# . Esto debido al borrado de tipo hecho por el compilador de Java.

La mejor solución para usted probablemente sería utilizar el objeto Gson en el lugar donde conoce el tipo de objeto que necesita serializar/deserializar.

Si no está interesado en crear instancias del objeto Gson cada vez, puede, por supuesto, mantenerlo estático al menos, ya que no necesita ningún tipo de parámetro cuando se crea.

Cuestiones relacionadas