【问题标题】:retrofit JSON to POJO将 JSON 改造为 POJO
【发布时间】:2015-09-10 18:54:07
【问题描述】:

我是 android 新手,我使用的是 retrofit

问题是我无法从请求中获取我的POJO

我的要求是:

@FormUrlEncoded
@POST("/index.php")
void login(@Field("io") String command,
           @Field("lu") String userName,
           @Field("lp") String password,
           @Field("lm") String imei,
           @Field("l") int language,
           RestCallback<ModelLoginResponse> callback);

服务器 JSON 响应是:

  {
    "tk": "thdoz4hwer32",
    "pn": "1",
    "lc": {
        "1": "Opel Combo",
        "3": "VW Crafter",
        "7": "Opel Vivaro"
    },
    "stg": {
        "rs": "30",
        "sml": "http://exemple.mob.ru",
        "ssl": "index.php"
    }
}

where 1,3,7 are different every time

还有我的 POJO 类:

 @Parcel
    public class ModelLoginResponse {

    @SerializedName("pn")
    private String personalNumber;

    @SerializedName("tk")
    private String token;

    //    ?????? for "lc" and "stg" 

    public void ModelResponse(String personalNumber, String token){
        this.personalNumber = personalNumber;
        this.token = token;
    }

    public String getPersonalNumber() {
        return personalNumber;
    }

    public void setPersonalNumber(String personalNumber) {
        this.personalNumber = personalNumber;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
        }
    }

我应该如何完成我的ModelLoginResponse POJO 类以获得完整的服务器响应???

【问题讨论】:

    标签: android json rest retrofit pojo


    【解决方案1】:

    我知道这是一个老问题,您可能已经想通了,但我将在这里发布一个答案,以便其他人可能会发现它有帮助。

    对于每个响应的键值可能不同的“lc”字段,您可以使用 Map 数据结构,例如 HashMap。

    您可以对“stg”字段使用相同的 Map 结构,但如果您知道键将始终相同,通常最好为该项目创建另一个 POJO 类。

    简而言之,您的回复将类似于:

    @Parcel
    public class ModelLoginResponse {
        @SerializedName("pn")
        private String personalNumber;
    
        @SerializedName("tk")
        private String token;
    
        @SerializedName("lc")
        private HashMap<String, String> lcMap;
    
        @SerializedName("stg")
        private StgResponse stgResponse;
    
        //add getters and setters if you need them.
    }        
    

    StgResponse 将类似于:

    public class StgResponse {
        @SerializedName("rs")
        private Integer rs;
    
        @SerializedName("sml")
        private String sml;
    
        @SerializedName("ssl")
        private String ssl;
    
        //Getters and setters
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      尝试以这种方式定义您的 ModelLoginResponse 类:

      @Parcel
      public class ModelLoginResponse {
      
      @SerializedName("tk")
      private String token;
      
      @SerializedName("pn")
      private String personalNumber;
      
      @SerializedName("lc")
      private String[3] lc;
      
      @SerializedName("stg")
      private String[3] stg; 
      
      public ModelResponse(){}
      
      public String getPersonalNumber() {
          return personalNumber;
      }
      
      public void setPersonalNumber(String personalNumber) {
          this.personalNumber = personalNumber;
      }
      
      public String getToken() {
          return token;
      }
      
      public void setToken(String token) {
          this.token = token;
      }
      
      public void setLc(String[] lc){
          this.lc = lc;
      }
      
      public void setStg(String[] stg){
          this.stc = stg;
      }
      
      public String getLc(){
          return lc;
      }
      
      public String getStg(){
          return stg;
      }
      }
      

      如果要解析 JSON 字符串,则使用 GSON 库,您只需要一个不带参数的默认构造函数,并且 JSON 字符串的每个“字段”都需要其在目标类中的对应属性。

      【讨论】:

      • 感谢您的宝贵时间,但您的解决方案不可行,例如,我需要从 stg 获取 rs 的 int 值 这是stg 的内部类使用相同的逻辑,对我来说主要问题是 lc 对象,因为 1,3,7 发生了变化,所以我不能使用@SerialisedName("tag")
      • 也许它不会起作用,但如果您将“lc”和“stg”定义为 String[3] 数组,然后访问导航数组的元素。其他解决方案可以定义其他两个类“lc”和“stg”并在主类中使用@SerializedName(“tag”)而不是“private String lc”,您可以尝试使用“private Lc lc”,这是一个Lc 对象。第二个只是一个想法,我没有验证它
      猜你喜欢
      • 2019-02-17
      • 2016-06-20
      • 2015-03-16
      • 2020-11-16
      • 2015-01-11
      • 2015-01-14
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多