Bei der Migration von Volley zu Retrofit habe ich bereits eine gson-Klasse, die ich zuvor zum Konvertieren der JSONObject-Antwort in ein Objekt verwendet habe, das gson-Annotationen implementiert. Wenn ich versuche, http mithilfe von Nachrüsten anzufordern, meine App jedoch mit folgendem Fehler abstürzt:
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
Ich folge der Anleitung auf der Nachrüstseite und habe mir diese Implementierungen ausgedacht:
Dies ist meine Aktivität, bei der ich versuche, die Retro-http-Anforderung auszuführen:
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();
}
}
}
Meine Schnittstelle, die sich als meine API herausstellte
public interface GitHubService {
@GET("/ **sample here** /{petId}/{otherPet}")
Call<Pet> getResponse(@Path("petId") String userId, @Path("otherPet") String otherPet);
}
Und schließlich die Pet-Klasse, die die Antwort sein sollte:
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];
}
};
}
Antworten:
Vor
2.0.0
war der Standardkonverter ein Gson Konverter, aber in2.0.0
und später der Standard - Konverter istResponseBody
. Aus den Dokumenten:In
2.0.0+
müssen Sie explizit angeben, dass Sie einen Gson-Konverter möchten:Sie müssen Ihrer Gradle-Datei auch die folgende Abhängigkeit hinzufügen:
Verwenden Sie für den Konverter dieselbe Version wie für Ihre Nachrüstung. Das Obige entspricht dieser Nachrüstungsabhängigkeit:
Beachten Sie außerdem, dass die Nachrüstdokumente zum Zeitpunkt des Schreibens nicht vollständig aktualisiert wurden, weshalb Sie in diesem Beispiel in Schwierigkeiten geraten sind. Aus den Dokumenten:
quelle
Wenn jemand in Zukunft darauf stößt, weil Sie versuchen, Ihre eigene benutzerdefinierte Konverterfabrik zu definieren, und dieser Fehler auftritt, kann dies auch daran liegen, dass mehrere Variablen in einer Klasse mit einem falsch geschriebenen oder demselben serialisierten Namen vorhanden sind. IE:
Wenn Sie serialisierte Namen zweimal definiert haben (wahrscheinlich aus Versehen), wird genau dieser Fehler ausgelöst.
Update : Beachten Sie, dass diese Logik auch über die Vererbung gilt. Wenn Sie eine übergeordnete Klasse mit einem Objekt erweitern, das denselben serialisierten Namen wie in der Unterklasse hat, verursacht dies dasselbe Problem.
quelle
Basierend auf dem Top-Kommentar habe ich meine Importe aktualisiert
Ich habe http://www.jsonschema2pojo.org/ verwendet, um Pojos aus Spotify-JSON-Ergebnissen zu erstellen und sicherzustellen, dass das Gson-Format angegeben wird.
Heutzutage gibt es Android Studio-Plugins, mit denen Sie die Pojo- oder Kotlin-Datenmodelle für Sie erstellen können. Eine großartige Option für Mac ist Quicktype. https://itunes.apple.com/us/app/paste-json-as-code-quicktype/id1330801220
quelle
In meinem Fall hatte ich ein TextView-Objekt in meiner Modalklasse und GSON wusste nicht, wie man es serialisiert. Das Markieren als "vorübergehend" löste das Problem.
quelle
Stellen Sie einfach sicher, dass Sie nicht zweimal denselben Serialisierungsnamen verwenden
entferne einfach einen von ihnen
quelle
@ Silmarilos 'Beitrag hat mir geholfen, dieses Problem zu lösen. In meinem Fall habe ich "id" als serialisierten Namen verwendet, wie folgt:
und ich habe es geändert in
Alle arbeiten jetzt. Ich habe vergessen, dass 'id' ein Standardattribut ist.
quelle
Dies kann jemandem helfen
In meinem Fall habe ich fälschlicherweise SerializedName so geschrieben
Es sollte sein
quelle
Hey, ich habe heute das gleiche Problem durchgemacht. Ich habe einen ganzen Tag gebraucht, um eine Lösung zu finden, aber dies ist die Lösung, die ich endlich gefunden habe. Ich verwende Dagger in meinem Code und musste den Gson-Konverter in meiner Nachrüstinstanz implementieren.
Das war also vorher mein Code
Das war es, womit ich endete
Beachten Sie, dass es im ersten Beispiel keinen Konverter gibt. Wenn Sie Gson nicht instanziiert haben, fügen Sie ihn wie folgt hinzu
und stellen Sie sicher, dass Sie es in den Methodenaufruf zur Nachrüstung aufgenommen haben.
Ich hoffe noch einmal, dass dies jemandem wie mir hilft.
quelle
In meinem Fall war dies darauf zurückzuführen, dass versucht wurde, eine von meinem Dienst zurückgegebene Liste in eine ArrayList aufzunehmen. Also was ich hatte war:
wenn ich hätte haben sollen
Hoffe das hilft jemandem!
quelle
In meinem Fall bestand das Problem darin, dass in meinem SUPERCLASS-Modell dieses Feld definiert war. Sehr dumm, ich weiß ....
quelle