Gson-Jsonから型指定されたArrayList <T>に変換する


211

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。私は何をしますか?


別のアプローチについては、stackoverflow.com
/ questions / 44589381 /…

回答:


515

TypeTokenを使用して、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)

または、さまざまな代替案についてこの回答を見ることができます。


3
このアプローチを試したところ、TypeToken()がアクセスのみを保護しているというコンパイルエラーが発生しました
Jonathan

1
@jonney同じ問題があります。解決策はありますか?
Zapnologica、2015年

15
保護されたアクセスエラーが発生している場合は、{ }以前に.getType()
省略

@Alexはまず配列に逆シリアル化してから、その配列をListに変換しますか、それとも直接Listに逆シリアル化しますか?
Adnan Ali

完全牛!私はそれを...まあ...決して考えなかったでしょう。ありがとうございました。
ジョンウォード

26

JSONサンプルは次のとおりです。

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

したがって、SharedPrefrencesにモジュールのarraylistを保存する場合は、次のようにします。

1-このメソッドを使用して、返された配列リストをjson形式に変換します

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

2-共有環境に保存します

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を解析する場合にも実行できます。GsonLibraryを使用することで、それが役立つことを願っています


私はsharedPreferencesについて学ぶためにここに来ていない-これは、不必要な情報の多くの古い答え3年として正しい解が、本質的には同じである
Xerus

8

配列を使用したい場合、それは非常に簡単です。

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

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


8

コトリン

data class Player(val name : String, val surname: String)

val json = [
  {
    "name": "name 1",
    "surname": "surname 1"
  },
  {
    "name": "name 2",
    "surname": "surname 2"
  },
  {
    "name": "name 3",
    "surname": "surname 3"
  }
]

val typeToken = object : TypeToken<List<Player>>() {}.type
val playerArray = Gson().fromJson<List<Player>>(json, typeToken)

または

val playerArray = Gson().fromJson(json, Array<Player>::class.java)

5

リストでJSON文字列を変換するこの簡単な方法を誰も作成しなかったのはなぜですか?

List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));

1

私は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);
                }           
    }
}

@サーガルザラ:あなたが期待している例は..?
arun kongara 2018

0

このような文字列があります

"[{"id":2550,"cityName":"Langkawi","hotelName":"favehotel Cenang Beach - Langkawi","hotelId":"H1266070"},
{"id":2551,"cityName":"Kuala Lumpur","hotelName":"Metro Hotel Bukit Bintang","hotelId":"H835758"}]"

そして、あなたはそれをひそかできArrayListを介して、Gsonのような

var hotels = Gson().fromJson(historyItem.hotels, Array<HotelInfo>::class.java).toList()

あなたのHotelInfoのクラスはこれを好きなはずです。

import com.squareup.moshi.Json

data class HotelInfo(

    @Json(name="cityName")
    val cityName: String? = null,

    @Json(name="id")
    val id: Int? = null,

    @Json(name="hotelId")
    val hotelId: String? = null,

    @Json(name="hotelName")
    val hotelName: String? = null
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.