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

ただし、これは通常、逆シリアル化に必要なだけです。シリアル化するとき、ライブラリが使用できるクラスを持つインスタンスがあります。

ところで、使用を検討したいと思うかもしれないもう1つの優れたJavaJSONライブラリは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 に答える