如何使用 Retrofit 2 处理动态 JSON?
Posted
技术标签:
【中文标题】如何使用 Retrofit 2 处理动态 JSON?【英文标题】:How to handle dynamic JSON with Retrofit 2? 【发布时间】:2016-08-05 02:46:33 【问题描述】:我对一个网址有 2 种类型的响应。首先是对象列表,其次是错误响应对象。
第一:
[
id: 1,
title: "title1",
description: "",
position: 1000
,
id: 2,
title: "title3",
description: "",
position: 1000
,
id: 3,
title: "title3",
description: "",
position: 1000
]
第二:
"status":"error",
"error":"no token"
任何想法如何使用 Retrofit 2 来处理它?当服务器返回错误响应时,我有错误:“预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT”
Category.class
public class Category
@SerializedName("id")
@Expose
private Id id;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("position")
@Expose
private Integer position;
/**
*
* @return
* The id
*/
public Id getId()
return id;
/**
*
* @param id
* The id
*/
public void setId(Id id)
this.id = id;
/**
*
* @return
* The title
*/
public String getTitle()
return title;
/**
*
* @param title
* The title
*/
public void setTitle(String title)
this.title = title;
/**
*
* @return
* The description
*/
public String getDescription()
return description;
/**
*
* @param description
* The description
*/
public void setDescription(String description)
this.description = description;
/**
*
* @return
* The position
*/
public Integer getPosition()
return position;
/**
*
* @param position
* The position
*/
public void setPosition(Integer position)
this.position = position;
对服务器的请求:
public void loadCategories(final boolean pullToRefresh)
Call<List<Category>> categoriesCall = mRequestHandler.getCategories(Keys.CATEGORY_CATALOGS);
categoriesCall.enqueue(new Callback<List<Category>>()
@Override
public void onResponse(Call<List<Category>> call, Response<List<Category>> response)
if (response.isSuccess())
getView().setData(response.body());
@Override
public void onFailure(Call<List<Category>> call, Throwable t)
getView().showError(null, pullToRefresh);
Log.e("Error:", t.getMessage());
);
【问题讨论】:
你能发布你的代码吗? 使用你的数组所在的包装响应对象以及错误属性。任何一个都将为空,检查它以查看您得到了什么样的响应。我不知道是否可以同时使用数组和对象作为响应 修复你的服务器。响应不能是数组或对象。否则,您将不得不在没有改造的情况下手动解析您的对象并捕获该异常 【参考方案1】:我可以看到您的服务器在 HTTP_STATUS 200 上发送错误。 这就是改造将其视为响应而不是错误的原因。 对服务器端进行此更改将导致 public void onFailure(Call> call, Throwable t) 调用。
【讨论】:
以上是关于如何使用 Retrofit 2 处理动态 JSON?的主要内容,如果未能解决你的问题,请参考以下文章
Android Retrofit Json Parsing(部分json动态)
如何使用 Retrofit2 处理嵌套 JsonObjects 的动态字段
如何使用 Kotlin Coroutines 在 Retrofit 中处理 204 响应?