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.

Eduardo
sumber
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.

Pshemo
sumber
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"
    }
]
Narendra Pathai
sumber
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);
chenyueling
sumber
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
1
Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);
shahzeb khan
sumber