web-dev-qa-db-ja.com

Gson - Jsonから型付きArrayList <T>への変換

Gsonライブラリを使用して、JSON文字列をカスタムクラスArrayListJsonLogに変換する方法を教えてください。基本的に、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を参照していることを理解していないようです。私は何をしますか?

183
Matthew Quiros

Json文字列をカスタムオブジェクトにロードするには、 TypeToken を使用できます。

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

あなたのJSONサンプルは:

{
    "status": "ok",
    "comment": "",
    "result": {
    "id": 276,
    "firstName": "mohamed",
    "lastName": "hussien",
    "players": [
            "player 1",
            "player 2",
            "player 3",
            "player 4",
            "player 5"
    ]
}

あなたがあなたのSharedPrefrencesにモジュールの配列リストを保存したいのであればそう:

1 - このメソッドを使用して、返されたアレイリストをJSON形式に変換します。

public static String toJson(Object jsonObject) {
    return new Gson().toJson(jsonObject);
}

2-共有prefrenecesに保存する

PreferencesUtils.getInstance(context).setString("players", toJson((.....ArrayList you want to convert.....)));

3-いつでもそれを取得するにはそのような共有設定からJsonStringを取得します

String playersString= PreferencesUtils.getInstance(this).getString("players");

4-再度配列リストに変換する

public static Object fromJson(String jsonString, Type type) {
    return new Gson().fromJson(jsonString, type);
}

ArrayList<String> playersList= (ArrayList<String>) fromJson(playersString,
                    new TypeToken<ArrayList<String>>() {
                    }.getType());

あなたがオブジェクトのArrayListを解析したい場合にもこの解決策は可能です---それはあなたがそれをあなたが助けることを望みます Gsonライブラリ .

23
Mohamed Hussien

もしあなたが配列を使いたいのなら、それはとても簡単です。

logs = gson.fromJson(br, JsonLog[].class); // line 6

JsonLogを配列として提供しますJsonLog[].class

2
Ali Asadi

私はgsonについてはよくわかりませんが、これはJon.sampleを使って行う方法です。gsonを使用して同様の方法があるはずです。

{"プレーヤー":["プレーヤー1"、 "プレーヤー2"、 "プレーヤー3"、 "プレーヤー4"、 "プレーヤー5"]}

=================================================

import Java.io.FileReader;
import Java.util.List;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class JosnFileDemo {

    public static void main(String[] args) throws Exception
    {
        String jsonfile ="fileloaction/fileName.json";


                FileReader reader = null;
                JSONObject jsb = null;
                try {
                    reader = new FileReader(jsonfile);
                    JSONParser jsonParser = new JSONParser();
                     jsb = (JSONObject) jsonParser.parse(reader);
                } catch (Exception e) {
                    throw new Exception(e);
                } finally {
                    if (reader != null)
                        reader.close();
                }
                List<String> Players=(List<String>) jsb.get("Players");
                for (String player : Players) {
                    System.out.println(player);
                }           
    }
}
1
arun kongara