Gson - konversi dari Json ke ArrayList yang diketik <T>

211

Menggunakan pustaka Gson, bagaimana cara mengonversi string JSON ke ArrayListkelas khusus JsonLog? Pada dasarnya, JsonLogini adalah antarmuka yang diimplementasikan oleh berbagai jenis log yang dibuat oleh aplikasi Android saya - log SMS, log panggilan, log data - dan ini ArrayListadalah kumpulan dari semuanya. Saya terus mendapatkan kesalahan di baris 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
    }
}

Tampaknya kompiler tidak mengerti maksud saya mengetik ArrayList. Apa yang saya lakukan?

Matthew Quiros
sumber
Silakan juga merujuk ke stackoverflow.com/questions/44589381/… untuk pendekatan lain
Pankaj Jaiswal

Jawaban:

516

Anda dapat menggunakan TypeToken untuk memuat string json ke objek kustom.

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

Dokumentasi:

Merupakan tipe T generik .

Java belum menyediakan cara untuk mewakili tipe generik, jadi kelas ini melakukannya. Memaksa klien untuk membuat subkelas dari kelas ini yang memungkinkan pengambilan informasi jenis bahkan saat runtime.

Misalnya, untuk membuat tipe literal List<String>, Anda bisa membuat kelas dalam anonim kosong:

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

Sintaks ini tidak dapat digunakan untuk membuat tipe literal yang memiliki parameter wildcard, seperti Class<?>atau List<? extends CharSequence>.

Kotlin:

Jika Anda perlu melakukannya di Kotlin, Anda dapat melakukannya seperti ini:

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

Atau Anda dapat melihat jawaban ini untuk berbagai alternatif.

Alex
sumber
3
mencoba pendekatan ini dan saya mendapat kesalahan kompilasi mengatakan TypeToken () hanya memiliki akses yang dilindungi
Jonathan
1
@jonney Saya memiliki masalah yang sama. Ada solusi?
Zapnologica
15
jika Anda mendapatkan memiliki kesalahan akses yang dilindungi, Anda { }.getType()
mengabaikan
@Alex apakah itu melakukan deserialize terlebih dahulu ke Array kemudian Array dikonversi menjadi Daftar atau apakah langsung deserialize ke Daftar?
Adnan Ali
Sapi sepenuhnya! Saya pikir itu seperti ... baik ... tidak pernah. Terima kasih.
John Ward
26

Sampel JSON Anda adalah:

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

jadi jika Anda ingin menyimpan daftar array modul di SharedPrefrences Anda, maka:

1- akan mengonversi arraylist Anda yang dikembalikan ke format json menggunakan metode ini

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

2- Simpan di prefreneces bersama

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

3 - untuk mengambilnya kapan saja dapatkan JsonString dari preferensi Bersama seperti itu

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

4- mengubahnya lagi menjadi daftar array

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());

solusi ini juga dapat dilakukan jika Anda ingin mem-parsing ArrayList of Objects Semoga ini membantu Anda dengan menggunakan Gson Library .

Mohamed Hussien
sumber
ini adalah solusi yang tepat, tetapi pada dasarnya sama dengan jawaban tiga tahun yang lebih tua dengan banyak informasi yang tidak perlu - saya tidak datang ke sini untuk belajar tentang sharedPreferences
Xerus
8

Jika Anda ingin menggunakan Array, itu sangat sederhana.

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

Berikan JsonLogsebagai arrayJsonLog[].class

Ali Asadi
sumber
8

Kotlin

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)

ATAU

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

Mengapa tidak ada yang menulis cara sederhana ini untuk mengubah string JSON di Daftar ?

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

Saya tidak yakin tentang gson tetapi ini adalah bagaimana Anda melakukannya dengan Jon. Saya harap ada cara yang sama dengan menggunakan gson

{"Pemain": ["pemain 1", "pemain 2", "pemain 3", "pemain 4", "pemain 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
sumber
@ Sagar Zala: apa contoh yang Anda harapkan ..?
arun kongara
0

Anda memiliki string seperti ini.

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

Kemudian Anda dapat menyamarkannya ke ArrayList melalui Gson like

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

Kelas HotelInfo Anda harus seperti ini.

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
)
Shihab Uddin
sumber