簡體   English   中英

Retrofit2處理包含兩個模型數據的JSON響應

[英]Retrofit2 handle JSON response that contains two models data

從API調用后,我正在使用Retrofit2處理http請求。 讓我解釋一下。

我有2個 Java類(POJO)創建來處理用戶和講師數據,分別是User.javaLecturer.java 對於響應數據,例如:

{
  "users": [
    {
      "user_id": "28",
      "user_email": "john@abc.com",
      "user_password": "123"
    }
  ]
}

我可以使用User.java類來處理此響應。 該文件沒有什么復雜的,僅包含gettersetter方法。 講師數據也是如此,這是講師數據的示例:

{
  "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"
    }
  ]
}

為了解決這個問題,我想我需要創建另一個同時包含UserLecturer類的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.
}

首先,讓我說,您需要在此處處理的JSON被設計破壞了,因此您應該敦促人員/部門/公司對其進行修復。

其次,像Jackson這樣的JSON處理器允許輕松地解析這樣的多態數據結構,但是它們需要某種type標志來區分另一種類型(即type: "user"type: "lecturer" )。 也可以通過不使用此類type標志的方式來執行此操作,但是需要進行大量手工操作。 這里最后一個示例顯示了如何執行此操作。

是的,這是一種可能的解決方案。 Gson會忽略所有名稱與@SerializedName注釋不匹配的字段。 因此,您可以嘗試其他解決方案而無需創建更多pojo類-將結果作為String返回,並嘗試將此字符串解析為兩個類。 如果一個結果為空-那么您將得到另一個。 但是,如果兩個kbject都不為空,則原始響應包含來自兩個pojos的字段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM