Im migrant de l'utilisation de Volley vers Retrofit, j'ai déjà la classe gson que j'ai utilisée auparavant pour convertir la réponse JSONObject en un objet qui implémente les annotations gson. Lorsque j'essaie de faire une demande http get à l'aide de la mise à niveau, mais que mon application se bloque avec cette erreur:
Unable to start activity ComponentInfo{com.lightbulb.pawesome/com.example.sample.retrofit.SampleActivity}: java.lang.IllegalArgumentException: Unable to create converter for class com.lightbulb.pawesome.model.Pet
for method GitHubService.getResponse
Je suis le guide du site de rénovation et je propose ces implémentations:
C'est mon activité où j'essaye d'exécuter la requête http rétro:
public class SampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("**sample base url here**")
.build();
GitHubService service = retrofit.create(GitHubService.class);
Call<Pet> callPet = service.getResponse("41", "40");
callPet.enqueue(new Callback<Pet>() {
@Override
public void onResponse(Response<Pet> response) {
Log.i("Response", response.toString());
}
@Override
public void onFailure(Throwable t) {
Log.i("Failure", t.toString());
}
});
try{
callPet.execute();
} catch (IOException e){
e.printStackTrace();
}
}
}
Mon interface qui est devenue mon API
public interface GitHubService {
@GET("/ **sample here** /{petId}/{otherPet}")
Call<Pet> getResponse(@Path("petId") String userId, @Path("otherPet") String otherPet);
}
Et enfin la classe Pet qui devrait être la réponse:
public class Pet implements Parcelable {
public static final String ACTIVE = "1";
public static final String NOT_ACTIVE = "0";
@SerializedName("is_active")
@Expose
private String isActive;
@SerializedName("pet_id")
@Expose
private String petId;
@Expose
private String name;
@Expose
private String gender;
@Expose
private String age;
@Expose
private String breed;
@SerializedName("profile_picture")
@Expose
private String profilePicture;
@SerializedName("confirmation_status")
@Expose
private String confirmationStatus;
/**
*
* @return
* The confirmationStatus
*/
public String getConfirmationStatus() {
return confirmationStatus;
}
/**
*
* @param confirmationStatus
* The confirmation_status
*/
public void setConfirmationStatus(String confirmationStatus) {
this.confirmationStatus = confirmationStatus;
}
/**
*
* @return
* The isActive
*/
public String getIsActive() {
return isActive;
}
/**
*
* @param isActive
* The is_active
*/
public void setIsActive(String isActive) {
this.isActive = isActive;
}
/**
*
* @return
* The petId
*/
public String getPetId() {
return petId;
}
/**
*
* @param petId
* The pet_id
*/
public void setPetId(String petId) {
this.petId = petId;
}
/**
*
* @return
* The name
*/
public String getName() {
return name;
}
/**
*
* @param name
* The name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
* The gender
*/
public String getGender() {
return gender;
}
/**
*
* @param gender
* The gender
*/
public void setGender(String gender) {
this.gender = gender;
}
/**
*
* @return
* The age
*/
public String getAge() {
return age;
}
/**
*
* @param age
* The age
*/
public void setAge(String age) {
this.age = age;
}
/**
*
* @return
* The breed
*/
public String getBreed() {
return breed;
}
/**
*
* @param breed
* The breed
*/
public void setBreed(String breed) {
this.breed = breed;
}
/**
*
* @return
* The profilePicture
*/
public String getProfilePicture() {
return profilePicture;
}
/**
*
* @param profilePicture
* The profile_picture
*/
public void setProfilePicture(String profilePicture) {
this.profilePicture = profilePicture;
}
protected Pet(Parcel in) {
isActive = in.readString();
petId = in.readString();
name = in.readString();
gender = in.readString();
age = in.readString();
breed = in.readString();
profilePicture = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(isActive);
dest.writeString(petId);
dest.writeString(name);
dest.writeString(gender);
dest.writeString(age);
dest.writeString(breed);
dest.writeString(profilePicture);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<Pet> CREATOR = new Parcelable.Creator<Pet>() {
@Override
public Pet createFromParcel(Parcel in) {
return new Pet(in);
}
@Override
public Pet[] newArray(int size) {
return new Pet[size];
}
};
}
Réponses:
Avant
2.0.0
, le convertisseur par défaut était un convertisseur gson, mais dans2.0.0
et plus tard, le convertisseur par défaut estResponseBody
. À partir de la documentation:Dans
2.0.0+
, vous devez spécifier explicitement que vous voulez un convertisseur Gson:Vous devrez également ajouter la dépendance suivante à votre fichier gradle:
Utilisez la même version pour le convertisseur que pour votre rénovation. Ce qui précède correspond à cette dépendance de mise à niveau:
Notez également qu'au moment de la rédaction de cet article, les documents de mise à jour ne sont pas complètement mis à jour, c'est pourquoi cet exemple vous a causé des problèmes. À partir de la documentation:
la source
Si quelqu'un rencontre jamais cela à l'avenir parce que vous essayez de définir votre propre usine de convertisseur personnalisé et que vous obtenez cette erreur, cela peut également être causé par le fait d'avoir plusieurs variables dans une classe avec un nom mal orthographié ou le même nom sérialisé. C'EST À DIRE:
Avoir des noms sérialisés définis deux fois (probablement par erreur) générera également exactement la même erreur.
Mise à jour : gardez à l'esprit que cette logique est également vraie via l'héritage. Si vous étendez à une classe parent avec un objet qui a le même nom sérialisé que vous le faites dans la sous-classe, cela provoquera le même problème.
la source
Sur la base des meilleurs commentaires, j'ai mis à jour mes importations
J'ai utilisé http://www.jsonschema2pojo.org/ afin de créer des pojo à partir des résultats Spotify json et en veillant à spécifier le format Gson.
De nos jours, il existe des plugins Android Studio qui peuvent créer les modèles de données pojo ou Kotlin pour vous. Quicktype est une excellente option pour mac. https://itunes.apple.com/us/app/paste-json-as-code-quicktype/id1330801220
la source
assurez-vous simplement que vous n'utilisez pas deux fois le même nom de sérialisation
enlève juste un d'entre eux
la source
Dans mon cas, j'avais un objet TextView dans ma classe modale et GSON ne savait pas comment le sérialiser. Le marquer comme «transitoire» a résolu le problème.
la source
Le post de @ Silmarilos m'a aidé à résoudre ce problème. Dans mon cas, c'est que j'ai utilisé "id" comme nom sérialisé, comme ceci:
et je l'ai changé en
Tout fonctionne maintenant. J'ai oublié que «id» est un attribut par défaut.
la source
Cela peut aider quelqu'un
Dans mon cas, j'ai écrit par erreur SerializedName comme ceci
Ça devrait être
la source
Hé, je traversais le même problème aujourd'hui m'a pris une journée entière pour trouver une solution, mais c'est la solution que j'ai finalement trouvée. J'utilise Dagger dans mon code et j'avais besoin d'implémenter le convertisseur Gson dans mon instance de mise à niveau.
donc c'était mon code avant
c'est ce que j'ai fini avec
remarquez qu'il n'y a pas de convertisseur dans le premier exemple et l'ajout si vous n'avez pas instancié Gson, vous l'ajoutez comme ceci
et assurez-vous de l'avoir inclus dans l'appel de méthode pour la modernisation.
espère encore une fois que cela aide quelqu'un comme moi.
la source
Dans mon cas, c'était dû à essayer de prendre une liste retournée par mon service dans une ArrayList. Donc ce que j'avais était:
quand j'aurais dû avoir
J'espère que cela aide quelqu'un!
la source
Dans mon cas, le problème était que mon modèle SUPERCLASS avait ce champ défini. Très stupide, je sais ...
la source