Menggunakan GSON untuk mengurai array JSON


110

Saya memiliki file JSON seperti ini:

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

Sebelumnya ketika file memiliki elemen root, saya akan menggunakan:

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

kode tetapi saya tidak bisa memikirkan cara membuat kode Wrapperkelas karena elemen root adalah array.

Saya telah mencoba menggunakan:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

dengan:

public class Wrapper{

    String number;
    String title;

}

Tapi belum beruntung. Bagaimana lagi saya bisa membaca ini menggunakan metode ini?

PS Saya telah mendapatkan ini untuk bekerja menggunakan:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

Tetapi saya lebih suka mengetahui bagaimana melakukannya (jika mungkin) dengan kedua metode tersebut.


4
Apakah Anda yakin ada koma setelah elemen judul? Jika Anda menghapusnya Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);berfungsi dengan baik untuk saya.
Pshemo

1
Itu akan menjadi masalah .. kesalahan sederhana!
Eduardo

Jawaban:


112

Masalah disebabkan oleh koma di akhir (dalam kasus Anda masing-masing ) objek JSON yang ditempatkan dalam larik:

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

Jika Anda menghapusnya, data Anda akan menjadi

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

dan

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

harus bekerja dengan baik.



1
@Snake BTW, dalam kasus jacksonperpustakaan dan komentar ini membuat array dan membungkusnya dengan Arrays.asList(..)lebih cepat daripada membuat daftar menggunakan TypeRefence. Saya tidak mengujinya dengan gsonperpustakaan tetapi mungkin layak untuk dijadikan tolok ukur.
Pshemo

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Sepertinya bekerja dengan baik. Tapi ada ,koma ekstra di string Anda.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

contoh panggilan:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
Bagi saya, ini mengubah objek saya menjadi List of LinkedTreeMap alih-alih objek List of Specification (misalnya).
Ryan Newsom

Di mana Anda mendapatkan kelas GsonUtils?
rosu alin

GsonUtilsadalah kelas tempat dia menerapkan toList()metodenya sendiri .
pengguna1438038

Ini tidak dapat berfungsi: TypeToken harus membuat nilai yang salah karena T tidak diketahui saat ini dikompilasi. Itu mungkin akan membuat token tipe untuk List <Object>. Anda harus menggunakan kelas yang sebenarnya saat membuat tipe.
Hans-Peter Störr

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.