2017-10-10 3 views
0

J'ai une réponse JSON qui ressemble à ceci:réponse cible JSON

{\ "sites \": [{\ "id \": 1, \ "photo \": \ "https://s3.us-east-2.amazonaws.com"} , ....

Il a une clé "lieux", puis un tableau d'objets. En réponse Retrofit:

 public void onResponse(Call<List<Venue>> call, Response<List<Venue>> response) { 
      venues = response.body(); 
      venueAdapter.notifyDataSetChanged(); 
     } 

Il échoue avec:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 

problème est que je ne sais pas comment dire Retrofit pour cibler la collecte que les points clés « lieux » à. Comment puis-je faire ceci? Je ne veux pas avoir à créer une autre classe Venues juste à cause de cette réponse JSON.

Répondre

1

Essayez comme ceci dans votre code.

ResponseVenue Classe

public class ResponseVenue { 

private List<VenuesBean> venues; 

public List<VenuesBean> getVenues() { 
    return venues; 
} 

public void setVenues(List<VenuesBean> venues) { 
    this.venues = venues; 
} 

public static class VenuesBean { 
    /** 
    * id : 1 
    * photo : https: //s3.us-east-2.amazonaws.com 
    */ 

    private int id; 
    private String photo; 

    public int getId() { 
     return id; 
    } 

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

    public String getPhoto() { 
     return photo; 
    } 

    public void setPhoto(String photo) { 
     this.photo = photo; 
    } 
} 
} 

Utilisez ensuite votre code.

public void onResponse(Call<ResponseVenue> call, Response<ResponseVenue> response) { 
    venues = response.body(); 
    venueAdapter.notifyDataSetChanged(); 
} 
0

Poste Lieu classe POJO. Je pense que vous pojo ne correspond pas à la réponse json.

0

Votre réponse est retrofit définie pour cette sortie JSON:

[{\ "id \": 1, \ "photo \": \ "https://s3.us-east-2.amazonaws.com"}, ....]

Il mappe directement l'objet dans la liste. Si vous n'avez qu'un seul tableau, alors vous pouvez changer votre réponse json comme ceci, mais si vous avez une autre paire clé-valeur dans cette réponse json alors vous devriez essayer la réponse @KeLiuyue. Créez une classe pojo VenueResponse et elle contient un champ List pour contenir votre classe Venue Pojo.
Après cette récupérer votre lieu Pojo comme ceci:

public void onResponse(Call<ResponseVenue> call, Response<ResponseVenue> response) { 
    venues = response.body().getVenues(); 
    venueAdapter.notifyDataSetChanged(); 
} 
0

Il suffit de remplacer

onResponse(Call<List<Venue>> call, Response<List<Venue>> response) 

à

onResponse(Call<Venue> call, Response<Venue> response) 

Et aussi dans l'interface API de retrofit fermer la liste et ne faire que Lieu