将JSON转换为POJO的适配器

5

我是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 类以获取完整的服务器响应?
2个回答

1

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

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

您可以使用相同的Map结构用于“stg”字段,但如果您知道键将始终相同,则通常最好为该项创建另一个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
}

希望这有所帮助。

0
尝试以这种方式定义您的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") - Choletski
也许这个方法行不通,但是如果你将"lc"和"stg"定义为String [3]数组,并通过导航数组访问元素。 否则,另一个解决方案可能是定义另外两个类"lc"和"stg",并在主类中使用@SerializedName("tag"),而不是 "private String lc",你可以尝试使用"Lc lc",它是一个Lc对象。 第二个只是一个想法,我还没有验证过。 - Marco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接