Parsing array JSON menjadi java.util.List dengan Gson

119

Saya memiliki JsonObjectnama "mapping"dengan konten berikut:

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

Saya tahu saya bisa mendapatkan array "servers"dengan:

mapping.get("servers").getAsJsonArray()

Dan sekarang saya ingin menguraikannya JsonArraymenjadi java.util.List...

Apa cara termudah untuk melakukannya?

Abel Callejo
sumber
2
@ruakh ada banyak perbedaan antara itu dan pertanyaan ini. Yang ini berurusan dengan Gson.
Abel Callejo
@AbelMelquiadesCallejo lihat jawabannya. Saya harap ini akan menyelesaikan masalah Anda.
Prateek
@ruakh ya saya setuju dengan Anda dan saya tahu JsonArrayimplementasinya Iterable. Hanya saja saya juga menemukan cara baru selain menambahkan perpustakaan baru.
Abel Callejo

Jawaban:

273

Jelas cara termudah untuk melakukannya adalah menggunakan fungsi parsing default Gson fromJson().

Ada implementasi fungsi ini yang cocok untuk saat Anda perlu melakukan deserialisasi ke salah satu ParameterizedType(misalnya, apa saja List), yaitu fromJson(JsonElement json, Type typeOfT).

Dalam kasus Anda, Anda hanya perlu mendapatkan Typedari a List<String>dan kemudian mengurai array JSON menjadi itu Type, seperti ini:

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

Dalam kasus Anda yourJsonadalah a JsonElement, tapi bisa juga a String, any Readeratau a JsonReader.

Anda mungkin ingin melihat dokumentasi Gson API .

MikO
sumber
8
Typebisa didapatkan di paket apa?
Abel Callejo
10
Typeadalah antarmuka java.lang.reflect
bawaan
Saya harus menggunakan getString()alih-alih get()atau .fromJson()mengeluh.
lenooh
@MikO Saya punya pertanyaan serupa dengan Gson di sini . Saya ingin melihat apakah Anda dapat membantu saya. Saya memang punya solusi tetapi masalahnya terlihat sangat berantakan hanya untuk mengurai JSON menjadi Peta.
john
18

Kode di bawah ini menggunakan com.google.gson.JsonArray. Saya telah mencetak jumlah elemen dalam list serta elemen dalam List

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


public class Test {

    static String str = "{ "+ 
            "\"client\":\"127.0.0.1\"," + 
            "\"servers\":[" + 
            "    \"8.8.8.8\"," + 
            "    \"8.8.4.4\"," + 
            "    \"156.154.70.1\"," + 
            "    \"156.154.71.1\" " + 
            "    ]" + 
            "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is : "+jsonObjList.size());
                    System.out.println("List Elements are  : "+jsonObjList.toString());


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

KELUARAN

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]
Prateek
sumber
8

Saya membaca solusi dari situs resmi Gson di sini

Dan kode ini untuk Anda:

    String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }    

Hasil acara di monitor:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1
Hoang
sumber
jawaban yang sama seperti di atas - masih menggunakan metode statisnew Gson().fromJson()
Abel Callejo
baik masalah saya adalah lain tetapi potongan Anda memecahkan masalah saya. Saya menyimpan daftar string tetapi saya ingin mengambil stringnya. Kemudian potongan Anda mengingat saya tentang kelas saya yang dapat saya letakkan String []. Untuk mengambil data. Terima kasih
badarshahzad
2

Saya bisa mendapatkan pemetaan daftar untuk bekerja dengan hanya menggunakan @SerializedNameuntuk semua bidang .. tidak perlu logika sekitar Type.

Menjalankan kode - pada langkah # 4 di bawah - melalui debugger, saya dapat mengamati bahwa List<ContentImage> mGalleryImagesobjek diisi dengan data JSON

Berikut contohnya:

1. JSON

   {
    "name": "Some House",
    "gallery": [
      {
        "description": "Nice 300sqft. den.jpg",
        "photo_url": "image/den.jpg"
      },
      {
        "description": "Floor Plan",
        "photo_url": "image/floor_plan.jpg"
      }
    ]
  }

2. Kelas Java dengan Daftar

public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

3. Kelas Java untuk item Daftar

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. Kode Java yang memproses JSON

    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }
Gene Bo
sumber
0

Mengingat Anda mulai dengan mapping.get("servers").getAsJsonArray(), jika Anda memiliki akses ke Jambu biji Streams , Anda dapat melakukan satu baris di bawah ini:

List<String> servers = Streams.stream(jsonArray.iterator())
                              .map(je -> je.getAsString())
                              .collect(Collectors.toList());

Note StreamSupporttidak akan bisa bekerja pada JsonElementtipe, jadi ini tidak cukup.

Alex Moore-Niemi
sumber