Comment parsingr un tableau JSON avec Gson

Je veux parsingr les tableaux JSON et utiliser gson. Tout d’abord, je peux enregistrer la sortie JSON, le serveur répond clairement au client.

Voici ma sortie JSON:

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

J’ai essayé cette structure pour l’parsing. Une classe, qui dépend d’un array unique et ArrayList pour tous les JSONArray.

  public class PostEntity { private ArrayList postList = new ArrayList(); public List getPostList() { return postList; } public void setPostList(List postList) { this.postList = (ArrayList)postList; } } 

Post classe:

  public class Post { private Ssortingng id; private Ssortingng title; /* getters & setters */ } 

Lorsque j’essaie d’utiliser gson no error, pas d’avertissement ni de journal:

  GsonBuilder gsonb = new GsonBuilder(); Gson gson = gsonb.create(); PostEntity postEnt; JSONObject jsonObj = new JSONObject(jsonOutput); postEnt = gson.fromJson(jsonObj.toSsortingng(), PostEntity.class); Log.d("postLog", postEnt.getPostList().get(0).getId()); 

Qu’est-ce qui ne va pas, comment puis-je résoudre?

Vous pouvez parsingr directement le JSONArray , vous n’avez pas besoin d’ PostEntity une nouvelle fois votre classe Post avec PostEntity et vous n’avez pas besoin de nouveau JSONObject().toSsortingng() non plus:

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

J’espère que cela pourra aider.

Je cherchais un moyen d’parsingr les tableaux d’objects d’une manière plus générique; voici ma consortingbution:

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> { @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  ArrayList parseAsArrayList(JsonElement json, T type) { ArrayList newArray = new ArrayList(); Gson gson = new Gson(); JsonArray array= json.getAsJsonArray(); Iterator 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 worlds; @Test public void grantThatDeserializerWorksAndParseObjectArrays(){ Ssortingng worldAsSsortingng = "{\"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((Ssortingng)worldAsSsortingng, 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 Ssortingng name; private Long id; public void setName(Ssortingng name) { this.name = name; } public Ssortingng getName() { return name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } } 
 Type listType = new TypeToken>() {}.getType(); List posts = new Gson().fromJson(jsonOutput.toSsortingng(), listType); 

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

Pour l’obtenir, je devais lire le tableau et convertir un par un les objects à 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 ssortingng to a list of objects * @param sJson Ssortingng sJson to be converted * @param tClass Class * @return List list of objects generated or null if there was an error */ public static  List convertFromJsonArray(Ssortingng sJson, Class tClass){ try{ Gson gson = new Gson(); List listObjects = new ArrayList<>(); //read each object of array with Json library JSONArray jsonArray = new JSONArray(sJson); for(int i=0; i 

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

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

Je l’ai testé et ça marche.