Gson解析Json配列が遭遇する汎用型消去問題
1365 ワード
今日、Gsonに小さなパッケージを作りたいと思っていましたが、Gson解析Json配列で遭遇した汎用タイプ消去問題に遭遇しました.以下に記録します.
誤った方法
このように書くと、実行はデータ型の不一致を報告し、Gsonが返すデータ型はListであり、私たちが望んでいるListではない.
解決策
Gson Type Token with dynamic ArrayList item type Java汎用タイプ消去
解決結果
誤った方法
// 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)
}