【问题标题】:Get nested JSON object with Jackson using retrofit使用改造获取带有 Jackson 的嵌套 JSON 对象
【发布时间】:2016-07-07 19:34:09
【问题描述】:

我有所有请求的 api,例如:

{
  "success": "true",
  "data": [],
  "errors": []
}

例如:

{
  "success": "true",
  "data": [
             {
                 "id": "666",
                 "name": "Cars",
                 "imgUrl": "/images/mod_catalog_prod/categories/no-image.jpg",
                 "descr": "",
                 "childRubricCount": 20
            },
            {
                 "id": "667",
                 "name": "Buses",
                 "imgUrl": "/images/mod_catalog_prod/categories/no-image.jpg",
                 "descr": "",
                 "childRubricCount": 14
           }
  ],
  "errors": []
}

如果success==true 可以调用onResponse 块,如果success==false 调用onFailure 块,错误文本来自json 的errors 变量。 Api 包含 json 响应中数据块的不同响应数据模型,我需要动态更改数据模型类。 有没有办法创造这样的东西?所有回复都会对我有用。

【问题讨论】:

  • 你形成数据 JsonArray 这样,你的 json 数据格式显示错误。 “数据”:[ { “id”:“666”,“名称”:“汽车”,“imgUrl”:“/images/mod_catalog_prod/categories/no-image.jpg”,“descr”:“”,“childRubricCount” “:20 },{“id”:“667”,“名称”:“巴士”,“imgUrl”:“/images/mod_catalog_prod/categories/no-image.jpg”,“descr”:“”,“childRubricCount” ": 14 } ]
  • 您需要为每种情况做出相同类型的响应,从而使您的错误为字符串类型。仅为成功类型制作模型。
  • @Jai Rajesh 你说得对,我已经更正了。但问题是从数据 json 字段处理不同 java 类模型的数据的真正方法是什么。如果成功 == false,则抛出带有错误消息的异常。
  • @Kundan Kumar Roy 所以我做到了,但我认为有一种方法可以在改造/杰克逊方面做到这一点。例如,这是相同的问题stackoverflow.com/questions/23070298/… 这适用于 GSON。
  • 你在使用改造吗?

标签: android nested jackson retrofit


【解决方案1】:

试试这个

在您的 gradle 文件中添加此 compile 'com.google.code.gson:gson:2.6.2' 依赖项。

得到你的响应后 js​​onObject 像这样通过

public void onRequestSuccess(JSONObject jsonObject) {
    ModelItem item = new Gson().fromJson(jsonObject.toString(), ModelItem.class);
    List<ModelItem.DataItem> dataItems;
    List<ModelItem.ErrorItem> errorItems;

    if (item.getSuccess().equalsIgnoreCase("true")) {
        dataItems = item.getData();
        for (int i = 0; i < dataItems.size(); i++) {
            String name = dataItems.get(i).getName();
        }
    } else {
        errorItems = item.getErrors();
        for (int i = 0; i < errorItems.size(); i++) {
            String name = errorItems.get(i).getErrorMsg();
        }
    }
}

创建 Pojo 类 ModelItem.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.List;

public class ModelItem {

@SerializedName("success")
@Expose
private String success;
@SerializedName("data")
@Expose
private List<DataItem> data = new ArrayList<DataItem>();
@SerializedName("errors")
@Expose
private List<ErrorItem> errors = new ArrayList<ErrorItem>();

/**
 * @return The success
 */
public String getSuccess() {
    return success;
}

/**
 * @param success The success
 */
public void setSuccess(String success) {
    this.success = success;
}

/**
 * @return The data
 */
public List<DataItem> getData() {
    return data;
}

/**
 * @param data The data
 */
public void setData(List<DataItem> data) {
    this.data = data;
}

/**
 * @return The errors
 */
public List<ErrorItem> getErrors() {
    return errors;
}

/**
 * @param errors The errors
 */
public void setErrors(List<ErrorItem> errors) {
    this.errors = errors;
}

public class DataItem {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("imgUrl")
    @Expose
    private String imgUrl;
    @SerializedName("descr")
    @Expose
    private String descr;
    @SerializedName("childRubricCount")
    @Expose
    private Integer childRubricCount;

    /**
     * @return The id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id The id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return The name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name The name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return The imgUrl
     */
    public String getImgUrl() {
        return imgUrl;
    }

    /**
     * @param imgUrl The imgUrl
     */
    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    /**
     * @return The descr
     */
    public String getDescr() {
        return descr;
    }

    /**
     * @param descr The descr
     */
    public void setDescr(String descr) {
        this.descr = descr;
    }

    /**
     * @return The childRubricCount
     */
    public Integer getChildRubricCount() {
        return childRubricCount;
    }

    /**
     * @param childRubricCount The childRubricCount
     */
    public void setChildRubricCount(Integer childRubricCount) {
        this.childRubricCount = childRubricCount;
    }
}

public class ErrorItem {

    @SerializedName("error_code")
    @Expose
    private String errorCode;
    @SerializedName("error_msg")
    @Expose
    private String errorMsg;

    /**
     * @return The errorCode
     */
    public String getErrorCode() {
        return errorCode;
    }

    /**
     * @param errorCode The error_code
     */
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    /**
     * @return The errorMsg
     */
    public String getErrorMsg() {
        return errorMsg;
    }

    /**
     * @param errorMsg The error_msg
     */
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
}
}

【讨论】:

  • 您的错误 json 数组包含空列表。我添加这样的错误列表 "errors": [ { "error_code": "200", "error_msg": "Cars" } ] 您需要在此处更改所需内容并在 Model 类创建 getter 和 setter 方法中添加关键参数。
猜你喜欢
  • 2014-05-29
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多