1

私の質問はこれに非常に似ています: Unable to parse Json array using Gson

しかし、私はそれから答えを得ることができません。上記のリンクからの答え:

public static List<MapData> getData(){
    Gson gson = new Gson();
    String jsonString = "[{\"id\":18,\"city\":\"test\",\"street\":\"test 1\",\"zipcode\":121209,\"state\":\"IL\",\"lat\":32.158138,\"lng\":34.807838},{\"id\":19,\"city\":\"test\",\"street\":\"1\",\"zipcode\":76812,\"state\":\"IL\",\"lat\":32.161041,\"lng\":34.810410}]";
    Type type = new TypeToken<List<MapData>>(){}.getType();
    return gson.fromJson(jsonString, type);     
}

うまく機能しますが、ジェネリック型で暗黙の演算子を使用したいです。下記参照:

public static <T> List<T> getData(Class<T> classT){
    Gson gson = new Gson();
    String jsonString = "[{\"id\":18,\"city\":\"test\",\"street\":\"test 1\",\"zipcode\":121209,\"state\":\"IL\",\"lat\":32.158138,\"lng\":34.807838},{\"id\":19,\"city\":\"test\",\"street\":\"1\",\"zipcode\":76812,\"state\":\"IL\",\"lat\":32.161041,\"lng\":34.810410}]";
    Type type = new TypeToken<List<T>>(){}.getType();
    return gson.fromJson(jsonString, type);
}

そして、Class 引数をメソッドに渡そうとします。

List<MapData> data = getData(MapData.class);
System.out.println(data.get(0).city);

その後、エラーが発生しました:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.ssc.ctq.nav.util.MapData 

このエラーが発生する理由を誰か教えてもらえますか? 暗黙の演算子は TypeToken クラスでサポートされていませんか?

4

3 に答える 3

4

あなたはこのようにすることができます:

     Gson gson = new Gson();

    String jsonString = "[{\"id\":18,\"city\":\"test\",\"street\":\"test 1\",\"zipcode\":121209,\"state\":\"IL\",\"lat\":32.158138,\"lng\":34.807838},{\"id\":19,\"city\":\"test\",\"street\":\"1\",\"zipcode\":76812,\"state\":\"IL\",\"lat\":32.161041,\"lng\":34.810410}]";

    List<Map> tmpList = gson.fromJson(jsonString);
    List<T> resultList = new Arraylist<T>(tmplist.size());
    for(Map map:tmpList){
       String tmpJson = gson.toJson(map);
       resultList.add(gson.fromJson(tmpJson, classT));
    }
    return resultList;
于 2013-09-10T08:11:18.830 に答える
2

私は同じ問題に遭遇しました。TypeTokenのJavadoc から:

Class<?>この構文を使用して、 orなどのワイルドカード パラメーターを持つ型リテラルを作成することはできませんList<? extends CharSequence>

ジェネリックなしで、 Tinの型を明示的に示す必要があります。TypeToken<T>

于 2013-09-10T07:42:37.587 に答える