2 votes

Impossible de lire les données d'un objet en utilisant gson et retrofit

Le serveur renvoie actuellement un json qui ressemble au json donné ci-dessous, il contient un champ appelé data qui est un tableau de tableaux, chaque tableau comportant plusieurs objets et chaque objet ayant une clé appelée item_type . La clé item_type me permet de savoir exactement de quel type d'objet il s'agit afin de pouvoir le convertir en conséquence en Java, mais je ne parviens pas à lire le code de l'objet. item_type champ.

{  
   "page":1,
   "data":[  
      [  
         {  
            "id":1,
            "name":"xyz",
            "item_type":1
         }
      ],
      [  
         {  
            "cid":1,
            "item_type":2
         }
      ],
      [  
         {  
            "item":1,
            "item_type":3
         }
      ]
   ]
}

L'interface de rétrofit se présente comme suit

    @GET("Search")
        Observable<SearchResults> search(@Query(ParamsHolder.GET_QUERY) 
    String query, @Query(ParamsHolder.GET_PAGE) int page);

où le SearchResults ressemble à ceci

public class SearchResults {

    int page;

    List<List<Object>> data;

    public int getPage() {
        return page;
    }

    public List<List<Object>> getData() {
        return data;
    }
}

Je suis capable de récupérer les données sans problème, mais j'ai besoin de lire les objets qui se trouvent dans chaque liste. Pour ce faire, j'ai utilisé le code suivant

public class SearchItem {

  int item_type;

  public int getItemType() {
      return item_type;
  }
}

List<List<Object>> data = objects.getData();

for (int i = 0; i < data.size(); i++) {

  List<Object> list = data.get(i);

  for (int j = 0; j < list.size(); j++) {

    SearchItem item = (SearchItem) list.get(i);

    Log.d("search", " json=" + list.get(j).toString());
    Log.d("search", " item=" + item.toString() + " type=" + item.getItemType());
    }

}

J'ai créé une fausse SearchItem qui, je l'ai supposé, me permettrait d'utiliser la classe Object pour que je puisse lire le item_type ce qui me permettrait de savoir exactement de quel type d'objet il s'agit.

Une erreur s'est produite com.google.gson.internal.LinkedTreeMap cannot be cast to in.example.models.SearchItem

L'objectif final est de pouvoir attribuer à chaque objet du tableau le type correct, et la seule façon d'y parvenir est de lire les données du tableau. item_type dans l'objet

1voto

Roshaan Farrukh Points 387

Utilisez Gson pour analyser directement la réponse

Mettre à jour les résultats de la recherche

 public class SearchResults {

    int page;

    List<List<SearchItem>> data;

    public int getPage() {
        return page;
    }

    public List<List<SearchItem>> getData() {
        return data;
    }
}

Vous pouvez accéder à item_type comme suit

searchResult.getData.get(i).get(0).item_type

1voto

has19 Points 357

Utiliser Response comme type de retour dans votre fonction de rétrofit d'interface comme indiqué ci-dessous

@GET("Search")
Observable<Response<ResponseBody>> search(@Query(ParamsHolder.GET_QUERY) 
              String query, @Query(ParamsHolder.GET_PAGE) int page);

de cette façon, vous pouvez récupérer le corps json complet et vous avez maintenant un contrôle total sur la façon dont les données sont analysées en fonction du type d'élément.

Donc, en gros, vous appelez la fonction response.body().string() pour obtenir le corps json

et vous pouvez ensuite l'analyser manuellement comme indiqué ci-dessous :

 JSONObject jsonObject = null;
        try {
            jsonObject = new JSONObject(response.body().string());
            JSONArray jsonArray = jsonObject.getJSONArray("data");

            //looping through the data array 
            for(int i = 0;i<jsonArray.length();i++){
                JSONArray  childArr = jsonArray.getJSONArray(i);
             //looping through current child array inside data 
                  for(int j = 0;j<childArr .length();j++){
                   JSONObject nestedChildObj =childArr.getJSONObject(j);
                   //now i have access to item_type
                   int item_type =  nestedChildObj .getInt("item_type")
                   //now you can use gson to parse the nestedChildObj based 
                   //on item_type or manually do the parsing
                 }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X