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.