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.

Eduardo
fuente
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.

Pshemo
fuente
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"
    }
]
Narendra Pathai
fuente
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);
chenyueling
fuente
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
1
Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);
shahzeb khan
fuente