Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.5k views
in Technique[技术] by (71.8m points)

java - GSON parse generic Json Array

My question is very similiar to this: Unable to parse Json array using Gson

But I cann't get the answer from it. The answer from above link:

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

It works well, but I want to use implicit operator on generic type. See below:

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

And then I try to pass the Class argument to the method:

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

Then an error was arised:

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

Can anyone tell me why I get this error? Is implicit operator is not supported in TypeToken class?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

you can do like this:

     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;

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...