【问题标题】:How can i make a model for this Json file for Retrofit?如何为这个 Json 文件制作模型以进行改造?
【发布时间】:2020-12-30 17:39:50
【问题描述】:

Json 文件是:

{
  "data": [
    {
      "name": "key",
      "error": "key is not valid"
    },
    {
      "name": "package_name",
      "error": "package name is not valid"
    }
  ],
  "success": false,
  "message": "information is not valid"
}

我有一个 BaseModel,其中包含“success”、“message”、“data”,并且我的所有回复都已扩展从这个类。 但是“数据对于来自服务器的每个响应都是不同的。

到目前为止我已经做到了:

public class BaseModel{
    private Object data;
    private boolean success;
    private String message;
}

这种错误情况下的哪些数据将转换为 DataError 数组:

public class DataError{
        private String name;
        private String error;
}

我得到一个错误告诉我:

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.example.mapp.Model.DataError

List<DataError> dataError = (List<DataError>)response.body().getData();
textView.append("Error:"+ dataError.get(0).getError());

【问题讨论】:

    标签: java android json casting retrofit


    【解决方案1】:

    解析时需要有List&lt;DataError>,虽然也可以解析为Map。在BaseModel Generic 中创建data,这样您也可以在其他类中重用它。将其命名为 BaseListModel 会导致它返回一个列表。

    public class BaseListModel<T>{
    private List<T> data;
    private boolean success;
    private String message;
    }
    

    现在您可以让 API 调用返回 BaseListModel&lt;DataError&gt;

    为了解析 Object 类型的响应,您可以创建其他基类。

     public class BaseModel<T>{
     private T data;
     private boolean success;
     private String message;
    }
    

    【讨论】:

    • 问题是其他响应中的所有“数据”并不总是一个列表!
    • 这就是为什么您创建另一个基类,它将 data 作为 Object 。我更新了答案。请检查
    • 通过这种方式,我可以检查“成功”是否为真,我得到一个“BaseModel”,如果它是假的,那么“BaseListModel”?
    • 无论是错误还是成功,响应结构都应该相同。如果错误数据应该是一个空白数组"data":[ ]而不是一个对象,它将违反合同并引发解析错误。否则你必须做一些事情Like this这是乏味的IMO。
    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2012-03-05
    • 2011-10-16
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多