JSON dizisini ayrıştırmak için GSON kullanma


110

Bunun gibi bir JSON dosyam var:

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

Dosyaların bir kök öğesi olduğu zamanlardan önce şunu kullanırdım:

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

kod ancak Wrapperkök eleman bir dizi olduğu için sınıfı nasıl kodlayacağımı düşünemiyorum .

Kullanmayı denedim:

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

ile:

public class Wrapper{

    String number;
    String title;

}

Ama hiç şansım olmadı. Bu yöntemi kullanarak bunu başka nasıl okuyabilirim?

Not: Bunu kullanarak çalışmam gerekiyor:

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

Ancak her iki yöntemle de (mümkünse) nasıl yapılacağını bilmeyi tercih ederim.


4
Başlık öğelerinden sonra virgül olduğundan emin misiniz? Onları kaldırırsan Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);benim için iyi çalışıyor.
Pshemo

1
Sorun da bu .. çok basit bir hata!
Eduardo

Yanıtlar:


112

Soruna, diziye yerleştirilen JSON nesnesinin sonundaki (sizin durumunuzda her biri ) virgül neden olur :

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

Bunları kaldırırsanız verileriniz

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

ve

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

iyi çalışmalı.


1
@Snake, Google Gson'a
Pshemo

1
@Snake BTW, jacksonkütüphane ve bu yorumun bir dizi oluşturması ve onu sarması durumunda, Arrays.asList(..)TypeRefence kullanarak bir liste oluşturmaktan daha hızlıdır. gsonKütüphane ile test etmedim ama kıyaslamaya değer olabilir.
Pshemo

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

class Wrapper{
    int number;
    String title;       
}

İyi çalışıyor gibi görünüyor. Ancak ,dizenizde fazladan bir Virgül var .

[
    { 
        "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());
}

örnek arama:

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

4
Benim için bu, nesnelerimi bir Şartname nesneleri Listesi yerine (örneğin) bir LinkedTreeMap Listesine dönüştürmektir.
Ryan Newsom

GsonUtils dersini nereden aldınız?
rosu alin

GsonUtilskendi toList()yöntemini koyduğu sınıftır .
user1438038

Bu işe yaramaz: TypeToken, bu derlendiğinde T bilinmediği için yanlış bir değer oluşturmalıdır. Bu muhtemelen Liste <Nesne> için tür belirteci oluşturacaktır. Türü oluştururken gerçek sınıfı kullanmanız gerekir.
Hans-Peter Störr

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.