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.