[英]Retrofit2 handle JSON response that contains two models data
從API調用后,我正在使用Retrofit2處理http請求。 讓我解釋一下。
我有2個 Java類(POJO)創建來處理用戶和講師數據,分別是User.java
和Lecturer.java
。 對於響應數據,例如:
{
"users": [
{
"user_id": "28",
"user_email": "john@abc.com",
"user_password": "123"
}
]
}
我可以使用User.java
類來處理此響應。 該文件沒有什么復雜的,僅包含getter
和setter
方法。 講師數據也是如此,這是講師數據的示例:
{
"lecturers": [
{
"lecturer_id": "3",
"user_id": "28",
"lecturer_name": "johny2"
}
]
}
我可以通過使用Lecturer.java
類來處理它。
但是問題是,如果響應在單個json上同時包含用戶和演講者數據,該如何處理? 。 這是request的示例:
{
"users": [
{
"user_id": "28",
"user_email": "john@abc.com",
"user_password": "123",
"lecturer_id": "3",
"lecturer_name": "johny2"
}
]
}
為了解決這個問題,我想我需要創建另一個同時包含User
和Lecturer
類的java類,不幸的是在這里我被卡住了。
這是我嘗試創建的新文件(Userlecturer.java) :
public class UserLecturer {
User user;
Lecturer lecturer;
// how to implement on this part
}
這是UserLecturer
界面:
public interface UserLecturerInterface {
@GET ( "api/endpoint/here" )
Call<UserLecturer> getLecturerByUserId (@Path( "userId" ) String userId );
}
感謝任何幫助。 如果上述用例還不夠清楚,請詢問我更多信息。 謝謝
我認為POJO應該是:
public class Users {
String userId;
String userEmail;
String userPassword;
String lecturerId;
String lecturerName;
}
即使JSON中有2個模型,您也只需要1個模型即可進行翻新。
如果您確實要將1個JSON響應拆分為2個模型,我認為您必須實現自定義JSON轉換器。
Gson gson = new GsonBuilder()
.registerTypeAdapter(UserLecture.class, new JsonDeserializer<UserLecture>() {
public UserLecture deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonArray usersJsonArray = json.getAsJsonObject().getAsJsonArray("users");
JsonObject userJsonObject = usersJsonArray.getAsJsonArray().get(0).getAsJsonObject();
User user = new User();
user.setUserId(userJsonObject.get("user_id").getAsString());
user.setUserEmail(userJsonObject.get("user_email").getAsString());
user.setUserPassword(userJsonObject.get("user_password").getAsString());
Lecturer lecturer = new Lecturer();
lecturer.setLecturerId(userJsonObject.get("lecturer_id").getAsString());
lecturer.setLecturerName(userJsonObject.get("lecturer_name").getAsString());
return new UserLecture(lecturer, user);
}
})
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl([YOUR_BASE_URL])
.addConverterFactory(GsonFactoryConverter.create(gson))
.build();
這是一些我用來將long轉換為Java Date對象的代碼。 大概,您可以對UserLecture對象執行相同的操作。 您應該能夠為User和Lecture提取單個json對象,創建一個新的UserLecture對象,並將User和Lecture作為對象。
Gson gson = new GsonBuilder().registerTypeAdapter(UserLecture.class, new JsonDeserializer<UserLecture>() {
public UserLecture deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject user = json.getAsJsonObject().getAsJsonObject("user");
JsonObject lecture = json.getAsJsonObject().getAsJsonObject("lecture");
return new UserLecture(user, lecture);
}
}).create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonFactoryConverter.create(gson))
.build();
然后在UserLecture
內部:
public UserLecture(JsonObject userJson, JsonObject lectureJson) {
this.user = new User();
this.user.setUserId(userJson.get("user_id").getAsInt());
this.user.serUserEmail(userJson.get("user_email").getAsString());
//so on.
}
是的,這是一種可能的解決方案。 Gson會忽略所有名稱與@SerializedName注釋不匹配的字段。 因此,您可以嘗試其他解決方案而無需創建更多pojo類-將結果作為String返回,並嘗試將此字符串解析為兩個類。 如果一個結果為空-那么您將得到另一個。 但是,如果兩個kbject都不為空,則原始響應包含來自兩個pojos的字段
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.