Gson - Json'dan yazılı bir ArrayList'e dönüştür <T>


211

Gson kitaplığını kullanarak bir JSON dizesini ArrayListözel bir sınıfa nasıl dönüştürebilirim JsonLog? Temel olarak, JsonLogAndroid uygulamam tarafından yapılan farklı günlük türleri tarafından uygulanan bir arayüzdür - SMS günlükleri, arama günlükleri, veri günlükleri - ve bu ArrayListhepsinin bir koleksiyonudur. 6. satırda hata almaya devam ediyorum.

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
    }
}

Derleyici bir daktilodan bahsettiğimi anlamıyor gibi görünüyor ArrayList. Ben ne yaparım?


Lütfen başka bir yaklaşım için stackoverflow.com/questions/44589381/… adresine bakın
Pankaj Jaiswal

Yanıtlar:


515

Özel bir nesneye json dizesini yüklemek için TypeToken kullanabilirsiniz .

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

Belgeler:

Genel tip T'yi temsil eder .

Java henüz genel türleri temsil etmek için bir yol sunmaz, bu nedenle bu sınıf bunu yapar. İstemcileri, çalışma zamanında bile tür bilgilerinin alınmasını sağlayan bu sınıfın bir alt sınıfını oluşturmaya zorlar.

Örneğin, için bir değişmez değer türü List<String>oluşturmak üzere boş bir anonim iç sınıf oluşturabilirsiniz:

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

Bu sözdizimi, Class<?>veya gibi joker karakter parametreleri olan tür değişmezleri oluşturmak için kullanılamaz List<? extends CharSequence>.

Kotlin:

Eğer bunu yapmak gerekirse KOTLIN bunu şöyle yapabilirsiniz:

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

Ya da bu cevabı çeşitli alternatifler için görebilirsiniz .


3
Bu yaklaşımı denedim ve TypeToken () sadece erişimi korumuştur diyerek derleme hatası aldım
Jonathan

1
@jonney Aynı sorunum var. Herhangi bir çözüm var mı?
Zapnologica

15
korumalı erişim hatası { }.getType()
alıyorsanız

@Alex ilk önce bir Dizinin serisini kaldırır, sonra Array Listeye dönüştürülür veya doğrudan List'e serileştirilir mi?
Adnan Ali

Tamamen inek! Bunu ... iyi ... asla. Teşekkür ederim.
John Ward

26

JSON örneğiniz:

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

SharedPrefrences'inize modül arraylisti kaydetmek istiyorsanız:

1- bu yöntemi kullanarak dönen arraylistinizi json formatına dönüştürür

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

2- Paylaşılan tercihlere kaydedin

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

3- İstediğiniz zaman geri almak için JsonString'i böyle Paylaşılan tercihlerden alın

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

4- tekrar dizi listesine dönüştürün

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

Bu çözüm, Nesnelerin ArrayList'ini ayrıştırmak istiyorsanız da yapılabilir Gson Kütüphanesi'ni kullanarak size yardımcı olur .


bu doğru çözümdür, ancak temelde pek çok gereksiz bilgi içeren üç yıllık yanıtla aynıdır
Buraya sharedPreferences

8

Dizileri kullanmak istiyorsanız, oldukça basittir.

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

Dizisini JsonLogbir dizi olarak sağlayınJsonLog[].class


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)

VEYA

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

5

Neden kimse JSON dizesini Listeye dönüştürmenin bu basit yolunu yazmamış ?

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

1

Ben gson hakkında emin değilim ama bu Jon ile böyle yaparsınız. Örnek umut gson kullanarak benzer bir yol olmalı

{"Oyuncular": ["oyuncu 1", "oyuncu 2", "oyuncu 3", "oyuncu 4", "oyuncu 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);
                }           
    }
}

@ Sagar Zala: Ne örnek bekliyorsunuz ..?
arun kongara

0

Bunun gibi bir dizeniz var .

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

Sonra bunu gizli olabilir ArrayList aracılığı GSON gibi

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

Kişisel HotelInfo sınıfı böyle olmalıdır.

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
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.