我正在尝试从服务器解析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);
谢谢您的建议,但我想出了一种可行的方法。这是我的方法…
首先,在我的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);
然后,我要做的就是检查message是否为null并相应地执行所需的操作。
API调用 API响应equation_list字段包含整数数组或字符串。例如: 但我有个例外 com.google.gson.java.lang.IllegalStateException:预期BEGIN_ARRAY但在第1行第1586列路径$[5]处是STRING。equation_list 我如何满足我的要求?
我试图解析来自服务器的响应json。数据是一个对象数组,但有时服务器在数组的项之间发送一个布尔值。像这样: 正如你所看到的,他们之间有一个错误。 tnx提前。
问题内容: 如何使用Gson解析此JSON?我有一个具有多个对象类型的数组,但我不知道需要创建哪种对象来保存此结构。我无法更改json消息(我无法控制服务器)。 唯一起作用的类是 JSON消息 (请注意具有多个对象类型的数组。) 问题答案: 《 Gson用户指南》明确涵盖了以下内容: https://sites.google.com/site/gson/gson-user-guide#TOC-Se
下面是我的用例:我想定义一个类似元组的对象,但是我可以通过属性名访问它的元素,例如 Pythons是这方面的首选,但问题是参数的数量是固定的。因此,如果只需要有带年份的tuple类对象,我要么就必须安装 或者创建一个只携带年份的名称元组的新定义。两种解决方案看起来都不怎么样。 有没有一种方法——使用< code>namedtuple或其他技术——当我实例化 我得到一个类似元组的对象实例化,它只有属
问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文
但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会