Android 从同一POJO类改装2.0解析动态json
我所拥有的 我有一个服务器成功响应 当出现错误时,返回相同的API 发生了什么事 在错误场景中,数据从JsonObject更改为JsonArray 我的问题 在success response,一切都很好,因为我用success response制作了POJO课程 在错误响应时,我的应用程序崩溃,表示试图读取对象,但找到了数组 我不能做什么 我不能改变后端,因为它已经被开发,并为网站也工作 我所做的 我在谷歌上搜索并找到了许多与我的问题无关的解决方案 波乔Android 从同一POJO类改装2.0解析动态json,android,retrofit2,jsonschema2pojo,Android,Retrofit2,Jsonschema2pojo,我所拥有的 我有一个服务器成功响应 当出现错误时,返回相同的API 发生了什么事 在错误场景中,数据从JsonObject更改为JsonArray 我的问题 在success response,一切都很好,因为我用success response制作了POJO课程 在错误响应时,我的应用程序崩溃,表示试图读取对象,但找到了数组 我不能做什么 我不能改变后端,因为它已经被开发,并为网站也工作 我所做的 我在谷歌上搜索并找到了许多与我的问题无关的解决方案 波乔 我的解决办法是用这样的东西 impor
我的解决办法是用这样的东西
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class Response {
@SerializedName("response_code")
@Expose
private Integer responseCode;
@SerializedName("status")
@Expose
private String status;
@SerializedName("meta_data")
@Expose
private MetaData metaData;
@SerializedName("data")
@Expose
private List<Object> data = null;
@SerializedName("message")
@Expose
private String message;
public Integer getResponseCode() {
return responseCode;
}
public void setResponseCode(Integer responseCode) {
this.responseCode = responseCode;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public MetaData getMetaData() {
return metaData;
}
public void setMetaData(MetaData metaData) {
this.metaData = metaData;
}
public List<Object> getData() {
return data;
}
public void setData(List<Object> data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public class MetaData {
@SerializedName("count")
@Expose
private Integer count;
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
}
这将有助于反序列化json字符串。我建议不要定义JSONObject或JSONArray use Object之类的类型……您的数据应该是JSONObject或JSONArray。如果它没有任何数据,您将获得空白。为什么不使用gson库?请显示您的改装实例创建代码。我使用不同的对象来处理错误和正常流,它们工作得很好。请查看我的POJO类,并建议我所怀疑的更改。这是一种优雅的方式还是一种变通的方式?如果你不想改变后端,这是一种优雅的方式。
{
"response_code": 500,
"status": "error",
"meta_data": {
"count": 0
},
"data": [],
"message": "Please specify all required parameter to add enquiries"
}
public class ReviewModel {
@SerializedName("data")
private Data mData;
public Data getData() {
return mData;
}
public void setData(Data data) {
mData = data;
}
public class Data {
@SerializedName("reviews")
private List<Review> mReviews;
public List<Review> getReviews() {
return mReviews;
}
public void setReviews(List<Review> reviews) {
mReviews = reviews;
}
}
public class Review {
@SerializedName("comment_date")
private String mCommentDate;
public String getCommentDate() {
return mCommentDate;
}
public void setCommentDate(String comment_date) {
mCommentDate = comment_date;
}
}
}
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class Response {
@SerializedName("response_code")
@Expose
private Integer responseCode;
@SerializedName("status")
@Expose
private String status;
@SerializedName("meta_data")
@Expose
private MetaData metaData;
@SerializedName("data")
@Expose
private List<Object> data = null;
@SerializedName("message")
@Expose
private String message;
public Integer getResponseCode() {
return responseCode;
}
public void setResponseCode(Integer responseCode) {
this.responseCode = responseCode;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public MetaData getMetaData() {
return metaData;
}
public void setMetaData(MetaData metaData) {
this.metaData = metaData;
}
public List<Object> getData() {
return data;
}
public void setData(List<Object> data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public class MetaData {
@SerializedName("count")
@Expose
private Integer count;
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
}
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
public class ArrayAdapterFactory implements TypeAdapterFactory {
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
TypeAdapter<T> typeAdapter = null;
try {
if (type.getRawType() == List.class || type.getRawType() == ArrayList.class) {
typeAdapter = new ArrayAdapter(gson,
(Class) ((ParameterizedType) type.getType())
.getActualTypeArguments()[0]);
}
} catch (Exception e) {
e.printStackTrace();
}
return typeAdapter;
}
}
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
class ArrayAdapter<T> extends TypeAdapter<List<T>> {
private Class<T> adapterclass;
private Gson gson;
public ArrayAdapter(Gson gson, Class<T> adapterclass) {
this.adapterclass = adapterclass;
this.gson = gson;
}
@Override
public List<T> read(JsonReader reader) throws IOException {
List<T> list = new ArrayList<T>();
final JsonToken token = reader.peek();
System.out.println(token);
// Handling of Scenario 2( Check JavaDoc for the class) :
if (token == JsonToken.STRING || token == JsonToken.NUMBER ||
token == JsonToken.BOOLEAN) {
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
} else if (token == JsonToken.BEGIN_OBJECT) {
// Handling of Scenario 1(Check JavaDoc for the class) :
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
} else if (token == JsonToken.BEGIN_ARRAY) {
reader.beginArray();
while (reader.hasNext()) {
@SuppressWarnings("unchecked")
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
}
reader.endArray();
}
return list;
}
@Override
public void write(JsonWriter writer, List<T> value) throws IOException {
}
}
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create();