web-dev-qa-db-fra.com

Comment analyser un tableau JSON avec Gson

Je veux analyser les tableaux JSON et utiliser gson. Premièrement, je peux enregistrer la sortie JSON, le serveur réagissant clairement au client. 

Voici ma sortie JSON:

 [
      {
           id : '1',
           title: 'sample title',
           ....
      },
      {
           id : '2',
           title: 'sample title',
           ....
     },
      ...
 ]

J'ai essayé cette structure pour l'analyse. Une classe, qui dépend de array et ArrayList uniques pour tous JSONArray.

 public class PostEntity {

      private ArrayList<Post> postList = new ArrayList<Post>();

      public List<Post> getPostList() { 
           return postList; 
      }

      public void setPostList(List<Post> postList) { 
           this.postList = (ArrayList<Post>)postList; 
      } 
 }

Classe post:

 public class Post {

      private String id;
      private String title;

      /* getters & setters */
 }

Lorsque j'essaie d'utiliser gson, aucune erreur, aucun avertissement et aucun journal:

 GsonBuilder gsonb = new GsonBuilder();
 Gson gson = gsonb.create();

 PostEntity postEnt;
 JSONObject jsonObj = new JSONObject(jsonOutput);
 postEnt = gson.fromJson(jsonObj.toString(), PostEntity.class);

 Log.d("postLog", postEnt.getPostList().get(0).getId());

Quel est le problème, comment puis-je résoudre?

61
Ogulcan Orhan

Vous pouvez analyser la JSONArray directement, vous n'avez pas besoin d'encapsuler votre classe Post avec PostEntity une fois de plus et vous n'avez pas besoin d'une nouvelle JSONObject().toString():

Gson gson = new Gson();
String jsonOutput = "Your JSON String";
Type listType = new TypeToken<List<Post>>(){}.getType();
List<Post> posts = gson.fromJson(jsonOutput, listType);

J'espère que cela pourra aider.

195
yorkw

Je cherchais un moyen d'analyser les tableaux d'objets d'une manière plus générique; voici ma contribution:

CollectionDeserializer.Java:

import Java.lang.reflect.ParameterizedType;
import Java.lang.reflect.Type;
import Java.util.ArrayList;
import Java.util.Collection;
import Java.util.Iterator;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

public class CollectionDeserializer implements JsonDeserializer<Collection<?>> {

    @Override
    public Collection<?> deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        Type realType = ((ParameterizedType)typeOfT).getActualTypeArguments()[0];

        return parseAsArrayList(json, realType);
    }

    /**
     * @param serializedData
     * @param type
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> ArrayList<T> parseAsArrayList(JsonElement json, T type) {
        ArrayList<T> newArray = new ArrayList<T>();
        Gson gson = new Gson();

        JsonArray array= json.getAsJsonArray();
        Iterator<JsonElement> iterator = array.iterator();

        while(iterator.hasNext()){
            JsonElement json2 = (JsonElement)iterator.next();
            T object = (T) gson.fromJson(json2, (Class<?>)type);
            newArray.add(object);
        }

        return newArray;
    }

}

JSONParsingTest.Java:

public class JSONParsingTest {

    List<World> worlds;

    @Test
    public void grantThatDeserializerWorksAndParseObjectArrays(){

        String worldAsString = "{\"worlds\": [" +
            "{\"name\":\"name1\",\"id\":1}," +
            "{\"name\":\"name2\",\"id\":2}," +
            "{\"name\":\"name3\",\"id\":3}" +
        "]}";

        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Collection.class, new CollectionDeserializer());
        Gson gson = builder.create();
        Object decoded = gson.fromJson((String)worldAsString, JSONParsingTest.class);

        assertNotNull(decoded);
        assertTrue(JSONParsingTest.class.isInstance(decoded));

        JSONParsingTest decodedObject = (JSONParsingTest)decoded;
        assertEquals(3, decodedObject.worlds.size());
        assertEquals((Long)2L, decodedObject.worlds.get(1).getId());
    }
}

World.Java:

public class World {
    private String name;
    private Long id;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}
6
Miere
Type listType = new TypeToken<List<Post>>() {}.getType();
List<Post> posts = new Gson().fromJson(jsonOutput.toString(), listType);
2
Salman khan

Certaines réponses de cet article sont valables, mais en utilisant TypeToken, la bibliothèque Gson génère un objet Tree avec des types irréels pour votre application.

Pour l'obtenir, je devais lire le tableau et convertir un à un les objets à l'intérieur du tableau. Bien sûr, cette méthode n’est pas la plus rapide et je ne recommande pas de l’utiliser si le tableau est trop gros, mais cela a fonctionné pour moi.

Il est nécessaire d'inclure la bibliothèque Json dans le projet. Si vous développez sur Android, il est inclus:

/**
 * Convert JSON string to a list of objects
 * @param sJson String sJson to be converted
 * @param tClass Class
 * @return List<T> list of objects generated or null if there was an error
 */
public static <T> List<T> convertFromJsonArray(String sJson, Class<T> tClass){

    try{
        Gson gson = new Gson();
        List<T> listObjects = new ArrayList<>();

        //read each object of array with Json library
        JSONArray jsonArray = new JSONArray(sJson);
        for(int i=0; i<jsonArray.length(); i++){

            //get the object
            JSONObject jsonObject = jsonArray.getJSONObject(i);

            //get string of object from Json library to convert it to real object with Gson library
            listObjects.add(gson.fromJson(jsonObject.toString(), tClass));
        }

        //return list with all generated objects
        return listObjects;

    }catch(Exception e){
        e.printStackTrace();
    }

    //error: return null
    return null;
}
2
J.S.R - Silicornio
[
      {
           id : '1',
           title: 'sample title',
           ....
      },
      {
           id : '2',
           title: 'sample title',
           ....
     },
      ...
 ]

Vérifiez le code facile pour cette sortie

 Gson gson=new GsonBuilder().create();
                List<Post> list= Arrays.asList(gson.fromJson(yourResponse.toString,Post[].class));
1
Prabh deep

vous pouvez obtenir une valeur de liste sans utiliser Type object.

EvalClassName[] evalClassName;
ArrayList<EvalClassName> list;
evalClassName= new Gson().fromJson(JSONArrayValue.toString(),EvalClassName[].class);
list = new ArrayList<>(Arrays.asList(evalClassName));

Je l'ai testé et ça marche.

0
Sumit Kumar

Pour converger dans un tableau d'objets

Gson gson=new Gson();
ElementType [] refVar=gson.fromJson(jsonString,ElementType[].class);

Pour convertir en type de post

Gson gson=new Gson();
Post [] refVar=gson.fromJson(jsonString,Post[].class);

Pour le lire sous forme de liste d'objets, vous pouvez utiliser TypeToken

List<Post> posts=(List<Post>)gson.fromJson(jsonString, 
                     new TypeToken<List<Post>>(){}.getType());
0
xrcwrn

Vous pouvez facilement le faire dans Kotlin en utilisant le code suivant:

val fileData = "your_json_string"
val gson = GsonBuilder().create()
val packagesArray = gson.fromJson(fileData , Array<YourClass>::class.Java).toList()

En gros, vous devez uniquement fournir une Array de YourClass objets.