如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Retrofit 解析动态密钥 Json 字符串

Android Retrofit Json Parsing(部分json动态)

如何使用 Retrofit2 处理嵌套 JsonObjects 的动态字段

如何使用 Kotlin Coroutines 在 Retrofit 中处理 204 响应?

如何使用 Retrofit 2.0 (Kotlin) 正确解析嵌套的 JSON 对象?

Moshi + Retrofit - 处理未知类型的 JSON 响应