【问题标题】:Handling more than 1 response in retrofit [duplicate]在改造中处理超过 1 个响应 [重复]
【发布时间】:2018-02-04 17:59:35
【问题描述】:

我的 api 响应中有 2 个响应,如果数据正确,一个表示成功,另一个表示数据不正确,我无法使用 pojo 类处理它,这是我的类

public class AirCraftSearchResponse {

@SerializedName("Data")
@Expose
private Data data;
@SerializedName("Message")
@Expose
private Object message;
public Data getData() {
    return data;
}

public void setData(Data data) {
    this.data = data;
}

public Object getMessage() {
    return message;
}

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

这是失败的两个响应

{
"Success": false,
"Message": "Could not convert string to DateTime: 2019-12-08T0000:00. Path 'Legs[0].DateTime', line 1, position 1185.",
"Data": [],
"total": 0
}

成功响应是

{
"Success": true,
"Message": "",
"Data": {},
"total": 0
}

当我做出响应并获得成功时,没有问题发生,因为我的 pojo 类具有相同的响应对象,当我失败时它会产生异常,我无法处理或获取它的消息,因为它转到 onFailure 方法 当我打印它的消息时,我得到了这一行

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 143 path $.Data

【问题讨论】:

  • 我听不懂你能给我解释一下吗?
  • 您可以通过查看改造 github repo 上的示例来编写自己的自定义转换器
  • 感谢您的评论,但我无法得到解决方案:)
  • @codekidX 我试试你的链接把我得到另一个异常我无法将对象转换为模型我尝试这一行 MyPOJO myObj = (MyPOJO) response.body();我将数据转换为对象,它给了我另一个例外

标签: java android retrofit


【解决方案1】:

问题本身就说明了

预期为 BEGIN_OBJECT,但为 BEGIN_ARRAY

您的键“数据”的值类型存在问题。成功时,您将发送 Object,即 {},如果失败,您将发送一个数组,即 []。尝试发送对象 {} 失败,您的问题将得到解决。

下面是失败的正确格式

{
 "Success": false,
 "Message": "Could not convert string to DateTime: 2019-12-08T0000:00. 
 Path 'Legs[0].DateTime', line 1, position 1185.",
 "Data": {},
 "total": 0
}

【讨论】:

  • 这是来自后端或创建 JSON 的任何位置的格式问题。
  • 这不是请求 iam 不要将这些数据从 api 响应发送回给我,并以两种方式返回给我,我想处理它,我无法在 api 结构中编辑它不是我的 api
  • 我知道这是来自后端的错误格式,我想通过创建 2 个模型或类似的东西来处理它,你了解我吗?
  • 这种情况下,需要在接收到 JSON 后序列化数据。或者为您的数据元素编写您自己的 Gson 反序列化器。这将检查数据元素是对象还是数组。
  • 我不知道如何序列化数据,你能给我解释一下吗?如何制作它或如何制作 gson 反序列化器
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 2018-07-07
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多