【问题标题】:Retrofit 2, same name different data type JSON ParsingRetrofit 2、同名不同数据类型JSON Parsing
【发布时间】:2017-10-25 14:18:59
【问题描述】:

我正在尝试解析来自服务器的 JSON 响应,如果在 post 方法中发送的查询中有更改,我将获得第一个作为响应,否则我将获得第二个作为响应。

1:

{
    "status": 1,
    "data": {
        "firstname": "First Name",
        "lastname": "Last Name",
        "mobilenumber": "1234567894",
        "emailid": "test@gmail.com",
        "timezone": "Asia/Kolkata"
    },
    "user_id": "",
    "response": "Profile Updated Successfully"
}

2:

{
    "status": 1,
    "data": "No changes to update",
    "user_id": ""
}

你可以看到data是否有变化返回一个对象,如果没有变化data返回一个字符串。

我正在使用这种方法来获取数据,并且我正在使用 Gson Converter 来映射数据。

这是请求接口

@FormUrlEncoded
@POST("pondguard/updateprofile")
Call<UserResponse> getInfoUpdated(@Field("user_id") String user_id,
                                  @Field("firstname") String firstName,
                                  @Field("lastname") String lastName,
                                  @Field("mobilenumber") String mobileNumber,
                                  @Field("emailid") String emailID)

这是我的 POJO 类

public class UserResponse implements Parcelable {

    public static final Creator<UserResponse> CREATOR = new Creator<UserResponse>() {
        @Override
        public UserResponse createFromParcel(Parcel in) {
            return new UserResponse(in);
        }

        @Override
        public UserResponse[] newArray(int size) {
            return new UserResponse[size];
        }
    };
    private String status;
    private Data data;
    private String response;
    private String error;

    protected UserResponse(Parcel in) {
        status = in.readString();
        data = in.readParcelable(Data.class.getClassLoader());
        response = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(status);
        dest.writeParcelable(data, flags);
        dest.writeString(response);
    }

    public String getStatus() {
        return status;
    }

    public Data getData() {
        return data;
    }

    public String getResponse() {
        return response;
    }

    public String getError() {
        return error;
    }
}

最后是我打的改造电话:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(ConstantUtils.BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

UserInfoRequestInterface requestInterface = retrofit.create(UserInfoRequestInterface.class);
Call<UserResponse> call = requestInterface.getInfoUpdated(user_id, firstName, lastName, phoneNumber, email, null, null);

【问题讨论】:

  • 告诉您的服务器人员发送相同的响应,无论查询如何,如果没有具有空白值的数据更新发送键

标签: android json retrofit2


【解决方案1】:

感谢您的建议,但我想出了一个工作方法。这是我的做法...

首先,在我的Pojo 类中,我添加了一个 JsonDeserializer,然后我检查“数据”是对象还是原语,并根据我设置相应的字段。

public class UserResponse  {

    @SerializedName("status")
    private String status;
    @SerializedName("data")
    private Object mData;
    @SerializedName("response")
    private String response;
    @SerializedName("error")
    private String error;

    private String message;
    private String firstname;
    private String lastname;
    private String mobilenumber;
    private String emailid;
    private String timezone;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getMobilenumber() {
        return mobilenumber;
    }

    public void setMobilenumber(String mobilenumber) {
        this.mobilenumber = mobilenumber;
    }

    public String getEmailid() {
        return emailid;
    }

    public void setEmailid(String emailid) {
        this.emailid = emailid;
    }

    public String getTimezone() {
        return timezone;
    }

    public void setTimezone(String timezone) {
        this.timezone = timezone;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Object getmData() {
        return mData;
    }

    public String getResponse() {
        return response;
    }

    public String getError() {
        return error;
    }

    public static class DataStateDeserializer implements JsonDeserializer<UserResponse> {

        @Override
        public UserResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            UserResponse userResponse = new Gson().fromJson(json, UserResponse.class);
            JsonObject jsonObject = json.getAsJsonObject();

            if (jsonObject.has("data")) {
                JsonElement elem = jsonObject.get("data");
                if (elem != null && !elem.isJsonNull()) {                     
                    if(elem.isJsonPrimitive()){                            
                        userResponse.setMessage(elem.getAsString());
                    }else{

                        userResponse.setFirstname(elem.getAsJsonObject().get("firstname").getAsString());
                        userResponse.setLastname(elem.getAsJsonObject().get("lastname").getAsString());
                        userResponse.setMobilenumber(elem.getAsJsonObject().get("mobilenumber").getAsString());
                        userResponse.setEmailid(elem.getAsJsonObject().get("emailid").getAsString());
                        userResponse.setTimezone(elem.getAsJsonObject().get("timezone").getAsString());
                    }
                }
            }
            return userResponse ;
        }
    }
}

我将 json 反序列化器附加到 GSON Builder 的类型适配器,并像这样在 Retrofit 中创建 GsonConvertor 的方法

Gson gson = new GsonBuilder()
                 .registerTypeAdapter(UserResponse.class, new UserResponse.DataStateDeserializer())
                .create();

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ConstantUtils.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

UserInfoRequestInterface requestInterface = retrofit.create(UserInfoRequestInterface.class);
        Call<UserResponse> call = requestInterface.getInfoUpdated(user_id, firstName, lastName, phoneNumber, email, null, null);

然后我要做的就是检查消息是否为空,并相应地执行我需要的操作。

【讨论】:

  • 我有一个类似的问题,但我在 UserResponse userResponse = new Gson().fromJson(json, UserResponse.class);有什么想法吗?
  • 谢谢,帮了大忙。
【解决方案2】:

你不能那样使用。您在响应中有一个 status 字段。使用status 字段检查是否存在任何数据。例如:

如果状态为 1:

{
  "status": 1,
  "data": {
  "firstname": "First Name",
  "lastname": "Last Name",
  "mobilenumber": "1234567894",
  "emailid": "test@gmail.com",
  "timezone": "Asia/Kolkata"
},
"user_id": "<userId>",
"response": "Profile Updated Successfully"
}

如果status 为 0:

{
  "status": 0,
  "data": {
  "firstname": "",
  "lastname": "",
  "mobilenumber": "",
  "emailid": "",
  "timezone": ""
},
"user_id": "",
"response": "An error message"
}

【讨论】:

  • 状态0不同时的响应。它将具有状态、错误和 user_id。
【解决方案3】:

试试这个,

try {
        // "data" returns an object
        JSONObject jsonObjectData = jsonObject.getJSONObject("data");
        //rest of your code
    } catch (JSONException e){
        //"data" returns a string
        e.printStackTrace();
        try {
            String data = jsonObject.getString("data");
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
    }

【讨论】:

  • 感谢您的回复,但我想出了另一种方法并发布了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多