Usando GSON para analizar una matriz JSON


110

Tengo un archivo JSON como este:

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

Antes, cuando los archivos tenían un elemento raíz, usaba:

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

código pero no puedo pensar en cómo codificar la Wrapperclase ya que el elemento raíz es una matriz.

He intentado usar:

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

con:

public class Wrapper{

    String number;
    String title;

}

Pero no he tenido suerte. ¿De qué otra manera puedo leer esto usando este método?

PD Tengo esto para trabajar usando:

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

Pero preferiría saber cómo hacerlo (si es posible) con ambos métodos.


4
¿Estás seguro de que hay una coma después de los elementos del título? Si los quitas, Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);funciona bien para mí.
Pshemo

1
Ese será el problema ... ¡un error tan simple!
Eduardo

Respuestas:


112

El problema es causado por una coma al final de (en su caso cada uno ) objeto JSON colocado en la matriz:

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

Si los elimina, sus datos se convertirán en

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

y

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

debería funcionar bien.



1
@Snake Por cierto, en el caso de la jacksonbiblioteca y este comentario, crear una matriz y envolverla Arrays.asList(..)es más rápido que crear una lista usando TypeRefence. No lo probé con la gsonbiblioteca, pero puede valer la pena compararlo.
Pshemo

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

class Wrapper{
    int number;
    String title;       
}

Parece funcionar bien. Pero hay una ,coma adicional en su cadena.

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

llamada de muestra:

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

4
Para mí, esto es convertir mis objetos en una Lista de LinkedTreeMap en lugar de una Lista de objetos de Especificación (por ejemplo).
Ryan Newsom

¿De dónde sacaste la clase de GsonUtils?
rosu alin

GsonUtilses la clase donde puso su propio toList()método.
user1438038

Esto no puede funcionar: TypeToken debe crear un valor incorrecto ya que no se conoce T cuando se compila. Eso probablemente creará el token de tipo para List <Object>. Tendría que usar la clase real al crear el tipo.
Hans-Peter Störr

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.