Сериализация / десериализация JSON универсального типа с помощью google-gson - PullRequest
5 голосов
/ 17 ноября 2010

Ну, я должен признаться, что я не очень хорош в универсальном типе в Java

Я написал класс сериализации / десериализации JSON в C #, используя 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 #.Теперь я пытаюсь преобразовать или, по крайней мере, написать другой класс JSON для сериализации / десериализации в Java.Я пробовал flexjson и google-gson , но я не знаю, как указать в Java.

Может ли кто-нибудь здесь помочь мне?Кстати, я предпочитаю google-gson

Ответы [ 3 ]

9 голосов
/ 19 ноября 2010

В Java вы должны передавать фактический класс, очищенный от типа, а не просто параметр типа, чтобы связыватели данных знали, какой тип использовать;так что-то вроде:

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

но обычно это просто необходимо для десериализации;при сериализации у вас есть экземпляр с классом, который могут использовать библиотеки.

Кстати, еще одна хорошая библиотека Java JSON, которую вы, возможно, захотите использовать: Jackson ;однако для этого конкретного примера все библиотеки, которые вы упомянули, должны работать.

1 голос
/ 19 ноября 2010

Подумав об этом, я не думаю, что есть способ решить эту проблему так же красиво, как это делается в вашем коде на C #.Это из-за стирания типов, выполняемого компилятором java.

Лучшим решением для вас, вероятно, будет использование объекта Gson в месте, где вы знаете тип объекта, который вам необходим для сериализации / десериализации.

Если вы не заинтересованы в создании экземпляров объекта Gson каждый раз, вы, конечно, можете сохранять как минимум один статический объект, поскольку для него не нужны никакие параметры типа при создании.

0 голосов
/ 19 ноября 2010

Это должно работать:

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);
    }
}
...