Gson解析Json配列が遭遇する汎用型消去問題

1365 ワード

今日、Gsonに小さなパッケージを作りたいと思っていましたが、Gson解析Json配列で遭遇した汎用タイプ消去問題に遭遇しました.以下に記録します.
誤った方法
//  Json              
public static  ArrayList parseJsonArray(Class myClass,String jsonStr)throws Exception{
   return new Gson().fromJson(jsonStr,new TypeToken>(){}.getType());
}

このように書くと、実行はデータ型の不一致を報告し、Gsonが返すデータ型はListであり、私たちが望んでいるListではない.
解決策
Gson Type Token with dynamic ArrayList item type Java汎用タイプ消去
解決結果
Gson gson = new Gson();
//   Json  
public static  T parseJson(Class type,String jsonStr)throws Exception{
   return gson.fromJson(jsonStr,type);
}
//  Json              
public static  ArrayList parseJsonArray(Class myClass,String jsonStr)throws Exception{
   Type type = new ListParameterizedType(myClass);
   return gson.fromJson(jsonStr, type);
}

private static class ListParameterizedType implements ParameterizedType {
   private Type type;
   private ListParameterizedType(Type type) {
      this.type = type;
   }
   @Override
   public Type[] getActualTypeArguments() {
      return new Type[] {type};
   }
   @Override
   public Type getRawType() {
      return ArrayList.class;
   }
   @Override
   public Type getOwnerType() {
      return null;
   }
   // implement equals method too! (as per javadoc)
}