【问题标题】:GSON parse generic Json ArrayGSON 解析通用 Json 数组
【发布时间】:2013-09-10 07:00:17
【问题描述】:

我的问题与此非常相似: 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 类不支持隐式运算​​符吗?

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    你可以这样做:

         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;
    

    【讨论】:

    • 我会说这是一个 hack,这样的代码不应该在生产环境中使用。通过应用此过程,将创建一个新集合,并将项目转移到新结构中。
    【解决方案2】:

    我遇到了同样的问题。来自Javadoc of TypeToken

    此语法不能用于创建具有通配符参数的类型文字,例如 Class&lt;?&gt;List&lt;? extends CharSequence&gt;

    您必须在TypeToken&lt;T&gt; 中明确指出T 的类型,不要使用泛型。

    【讨论】:

      【解决方案3】:

      您可以使用此方法将通用 json 字符串解析为映射

          public Map<String, String> getMapFromJson(String jsonString) {
          Map<String, String> map = new HashMap<>();
          try {
              JSONObject object = new JSONObject(jsonString);
              Iterator<?> iterator = object.keys();
              while (iterator.hasNext()) {
                  String key = (String) iterator.next();
                  if(!key.isEmpty() && !object.getString(key).isEmpty()){
                      map.put(key, object.getString(key));
                  }
              }
          } catch (JSONException e) {
              e.printStackTrace();
          }
          return map;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多