1. ホーム

[解決済み】Gson - Jsonから型付きArrayList<T>に変換する。

2022-04-04 01:20:24

質問

Gsonライブラリを使用して、JSON文字列をどのように ArrayList カスタムクラスの JsonLog ? 基本的には JsonLog は、私のAndroidアプリが作成するさまざまな種類のログ(SMSログ、通話ログ、データログ)によって実装されるインターフェイスであり、この ArrayList はそれらすべてのコレクションです。6行目でずっとエラーになるんだけど。

public static void log(File destination, JsonLog log) {
    Collection<JsonLog> logs = null;
    if (destination.exists()) {
        Gson gson = new Gson();
        BufferedReader br = new BufferedReader(new FileReader(destination));
        logs = gson.fromJson(br, ArrayList<JsonLog>.class); // line 6
        // logs.add(log);
        // serialize "logs" again
    }
}

どうやらコンパイラは、私が型付けされた ArrayList . どうすればいいのでしょうか?

解決方法は?

を使用することができます。 タイプトークン を使用して、json 文字列をカスタムオブジェクトにロードします。

logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());

ドキュメンテーション

一般的な型を表す T .

Javaはまだ汎用的な型を表現する方法を提供していないので、このクラスで表現しています。クライアントにこのクラスのサブクラスを作成させ、実行時にも型情報を取得できるようにします。

例えば、以下のような型リテラルを作成します。 List<String> であれば、空の匿名内部クラスを作成することができます。

TypeToken<List<String>> list = new TypeToken<List<String>>() {};

この構文は、次のようなワイルドカードパラメータを持つタイプリテラルを作成するためには使用できません。 Class<?> または List<? extends CharSequence> .

Kotlinです。

で行う必要がある場合は コトリン を使えば、こんな風にできます。

val myType = object : TypeToken<List<JsonLong>>() {}.type
val logs = gson.fromJson<List<JsonLong>>(br, myType)

または、次のように表示されます。 この回答 をご覧ください。