2012-02-25 10 views
6

estoy recibiendo datos JSON de un servicio Web, los datos de ejemplo se da a continuación:error Android JSON "BEGIN_OBJECT esperaba, pero era BEGIN_ARRAY en la línea 1 columna 2"

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

Cuando trato de convertirlo, se genera un error, lo estoy haciendo como:

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

mi sección de clase es:

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

class Data { 
    public List<Section> sections; 
} 

El LogCat dice:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT esperaba, pero era BEGIN_ARRAY en la línea 1 columna 2

Respuesta

6

El error explica cuál es incorrecto .. . ur devolver una matriz y no un objeto JSON

prueba como siguiente:

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

grandes gracias que trabajó para mí! –

+2

Esta es una mala respuesta. Cambiar la forma en que la API devuelve datos no siempre es una opción. – Prem

8

Está intentando crear un objeto que no sea de matriz (colección) desde un JSONArray. El error es bastante claro: GSON estaba esperando el comienzo de un objeto, pero encontró el comienzo de una matriz en su lugar.

Echa un vistazo a la página de documentación de abajo para ver cómo trabajar con la matriz y la Colección Tipos con GSON

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

A partir de los documentos:

Ejemplos de matrices

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

(Serialización) gson.toJson (ints); ==> imprime [1,2,3,4,5] gson.toJson (cadenas); ==> impresiones ["abc", "def", "ghi"]

(Deserialización) int [] ints2 = gson.fromJson ("[1,2,3,4,5]", int [ ].clase); ==> IntS2 será el mismo que enteros

También apoyamos matrices multidimensionales, con arbitrariamente complejas tipos de elementos Colecciones Ejemplos

Gson GSON = new Gson(); Colección ints = Lists.immutableList (1,2,3,4,5);

(Serie) Cadena json = gson.toJson (ints); ==> json es [1,2,3,4,5]

(Deserialización) Tipo collectionType = new TypeToken>() {}. getType(); Colección ints2 = gson.de Json (json, collectionType); IntS2 es igual enteros

bastante horrible: observamos cómo definir el tipo de colección Desafortunadamente, no hay manera de evitar esto en Java

Colecciones Limitaciones

puede serializar colección de objetos arbitrarios, pero no puede deserializar de ella Porque no hay forma de que el usuario indique el tipo de el objeto resultante Mientras se deserializa, Collection debe ser de un tipo genérico específico Todo esto tiene sentido, y rara vez es un problema w> hen following good Prácticas de codificación Java

+0

¡Muchas gracias por la explicación! –

0

Uso de clase Sección únicamente en lo siguiente:

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

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. – Badacadabra

Cuestiones relacionadas