2012-02-25 10 views
6

jestem coraz danych JSON z usługi internetowej, dane próbki jest podana poniżej:błąd Android json „Oczekiwany BEGIN_OBJECT ale BEGIN_ARRAY w wierszu 1 kolumnie 2”

[ 
    { 
    "SectionId": 1, 
    "SectionName": "Android" 
    } 
] 

Kiedy próbuję je konwertować, to zgłasza błąd, robię to jako:

Data data = new Gson().fromJson(jsonDataFromWebService, Data.class); 

mojej sekcji klasy jest:

class Section 
{ 
    public int SectionId; 
    public String SectionName; 
} 

class Data { 
    public List<Section> sections; 
} 

LogCat mówi:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Oczekiwany BEGIN_OBJECT ale BEGIN_ARRAY w wierszu 1 kolumna 2

Odpowiedz

6

Błąd wyjaśnia Co złego .. . ur powrocie tablicę, a nie obiekt JSON

spróbować, jak następuje:

JSONArray ja = new JSONArray(jsonStringReturnedByService); 

Data sections = new Data(); 

for (int i = 0; i < ja.length(); i++) { 
    Section s = new Section(); 
    JSONObject jsonSection = ja.getJSONObject(i); 

    s.SectionId = Integer.ValueOf(jsonSection.getString("SectionId")); 
    s.SectionName = jsonSection.getString("SectionName"); 

    //add it to sections list 
    sections.add(s); 
} 

return sections; 
+0

Wielkie dzięki pracował dla mnie! –

+2

To jest zła odpowiedź. Zmiana sposobu, w jaki API zwraca dane, nie zawsze jest opcją. – Prem

8

Próbujesz utworzyć obiekt inny niż Array (kolekcja) z JSONArray. Błąd jest całkiem jasny: GSON oczekiwał początku obiektu, ale zamiast tego znalazł początek tablicy.

Spójrz na stronie dokumentacji poniżej, aby zobaczyć, jak pracować z rodzajów Array i kolekcji z GSON

https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

Od docs:

Array Przykłady

Gson gson = new Gson(); int [] ints = {1, 2, 3, 4, 5}; String [] strings = {"abc", "def", "ghi"};

(Serializacja) gson.toJson (ints); ==> drukuje [1,2,3,4,5] gson.toJson (ciągi); ==> drukuje ["abc", "def", "ghi"]

(Deserializacja) int [] ints2 = gson.fromJson ("[1,2,3,4,5]", int [ ].klasa); ==> ints2 będzie taki sam jak wskazówki

również wspierać tablic wielowymiarowych o dowolnie skomplikowanych typów elementów Collections Przykłady

Gson gson = nowy Gson(); Kolekcja ints = Lists.immutableList (1,2,3,4,5);

(Serializacja) String json = gson.toJson (ints); ==> json to [1,2,3,4,5]

(Deserializacja) Typ collectionType = new TypeToken>() {}. getType(); Kolekcja ints2 = gson.fromJson (json, collectionType); ints2 jest taka sama jak wskazówki

Dość ohydne: zauważ, jak określić typ kolekcji Niestety, nie ma mowy, aby obejść ten problem w Javie

Kolekcje Ograniczenia

można szeregować zbiór dowolnych obiektów, ale nie mogę deserialize z tego powodu Ponieważ użytkownik nie może wskazać rodzaju obiektu , wynikowy obiekt Podczas przekształcania z postaci szeregowej kolekcja musi mieć typowy typ Wszystko to ma sens i rzadko stanowi problem. Praktyki kodowania Java

+0

Wielkie dzięki za wyjaśnienie! –

0

użyć klasy Sekcja wyłącznie w następujący sposób:

Section[] sectionArray = new Gson().fromJson(jsonDataFromWebService, Section[].class); 
for (Section section: sectionArray) { 
    Log.e("Debug", section.toString()); 
} 
+0

Chociaż ten kod może odpowiedzieć na pytanie, podanie dodatkowego kontekstu dotyczącego tego, w jaki sposób i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. – Badacadabra