【问题标题】:Resue of common structure of model with gson用gson抢救模型常见结构
【发布时间】:2017-02-28 15:56:45
【问题描述】:

我正在使用改造和 Gson 转换器。我有两个结构相同的 JSON,如下所示。

JSON 1

{"message":"ok", 
 "code":200,
 "result":[{"name":"test"
            "id":121
            }]
}

JSON 2

{"message":"ok", 
 "code":200,
 "result":[{"first_name":"test"
            "last_name":"testing2"
            "middle_name":"test123"
            }]
}

为此,我创建了一个通用模型类,例如

public void CommonModel {
    @SerializedName("code")
    public int code;

    @SerializedName("message")
    public String message;

    @SerializedName("result")
    public ResultModel result;

    public void ResultModel{
     public List<JSON1> json1;
     public List<JSON2> json2;
    }
}

public void JSON1 {
    @SerializedName("id")
    public int id;

    @SerializedName("name")
    public String name;
}

public void JSON2 {
    @SerializedName("first_name")
    public String firstName;

    @SerializedName("last_name")
    public String lastName;

    @SerializedName("middle_name")
    public String middleName;
}

但它不起作用。当我在杰克逊尝试相同的概念时,效果很好。我想将 CommonModel 重用于来自 web 服务的响应。有解决方案的请添加cmets

【问题讨论】:

  • 元素result是一个列表,而不是JSON1或JSON2
  • @RaphaelTeyssandier 你能帮忙纠正一下吗

标签: android json retrofit gson


【解决方案1】:

如下创建通用模型

public class Common {
    @SerializedName("message")
    private String message;

    @SerializedName("code")
    private String code;

    public String getMessage() {
        return message;
    }

    public String getCode() {
        return code;
    }
}

为 Json One 创建以下模型在此类上扩展通用模型

public class JsonOne extends Common {

    @SerializedName("result")
    private List<JsonObjectOne> jsonObjectOneList;

    public List<JsonObjectOne> getJsonObjectOneList() {
        return jsonObjectOneList;
    }

    public void setJsonObjectOneList(List<JsonObjectOne> jsonObjectOneList) {
        this.jsonObjectOneList = jsonObjectOneList;
    }
}

public class JsonObjectOne {
    @SerializedName("name")
    private String name;

    @SerializedName("id")
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

为 Json 两个创建模型在此类上扩展通用模型

public class JsonTwo extends Common {
    @SerializedName("result")
    private List<JsonObjectTwo> jsonObjectTwoList;

    public List<JsonObjectTwo> getJsonObjectTwoList() {
        return jsonObjectTwoList;
    }

    public void setJsonObjectTwoList(List<JsonObjectTwo> jsonObjectTwoList) {
        this.jsonObjectTwoList = jsonObjectTwoList;
    }
}

public class JsonObjectTwo {
    @SerializedName("first_name")
    private String firstName;

    @SerializedName("last_name")
    private String lastName;

    @SerializedName("middle_name")
    private String middleName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getMiddleName() {
        return middleName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }
}

【讨论】:

  • 您可以在通用模型本身中添加“结果”并重用它。我在找那个
  • 是的,你可以通用结果模型,拥有所有字段
【解决方案2】:

在我看来,你有两个解决方案。

1) 使用不同的类:

public void ModelOne {
    @SerializedName("code")
    public int code;

    @SerializedName("message")
    public String message;

    @SerializedName("result")
    public List<ResultModel> result;

    public void ResultModelOne {
        @SerializedName("id")
        public int id;

        @SerializedName("name")
        public String name;
    }
}


public void ModelTwo {
    @SerializedName("code")
    public int code;

    @SerializedName("message")
    public String message;

    @SerializedName("result")
    public List<ResultModel> result;

    public void ResultModel {

        @SerializedName("first_name")
        public String firstName;

        @SerializedName("last_name")
        public String lastName;

        @SerializedName("middle_name")
        public String middleName;
    }
}

2) 使用一个类,但在响应中解析:

public void Model {
    @SerializedName("code")
    public int code;

    @SerializedName("message")
    public String message;

    @SerializedName("result")
    public List<JSONObject> result;
}

public void ModelResultOne {
    @SerializedName("id")
    public int id;

    @SerializedName("name")
    public String name;
}

public void ModelResultTwo {
    @SerializedName("first_name")
    public String firstName;

    @SerializedName("last_name")
    public String lastName;

    @SerializedName("middle_name")
    public String middleName;
}

然后:

List<ModelResultOne> list = new Gson.fromJson(result, new TypeToken<ArrayList<ModelResultOne.class>>() {}.getType());

或

List<ModelResultTwo> list = new Gson.fromJson(result, new TypeToken<ArrayList<ModelResultTwo.class>>() {}.getType());

【讨论】:

  • 第一个,我现在正在做。但我需要按照您在第二个选项中的建议重用 Model 类。有什么方法可以解析响应。
  • 编辑您的问题,使用onResponse()
【解决方案3】:

也许你可以试试这个:

public void Model {
    @SerializedName("code")
    public int code;

    @SerializedName("message")
    public String message;

    @SerializedName("result")
    public ResultModel result;

public void ResultModel {
    @SerializedName("id")
    public int id;

    @SerializedName("name")
    public String name;

    @SerializedName("first_name")
    public String firstName;

    @SerializedName("last_name")
    public String lastName;

    @SerializedName("middle_name")
    public String middleName;
    }
}

你的反应会是这样的。

Model res = response.body(); //response is of onResponse() method
ResultModel resultModel = res.getResultModel() //create getters and setters of model to get data

if (resultModel.getId != null){
    // Do your handling for id and name here
} else {
   // Do your handling for first name, middle name and last name
}

我希望这对你有用

【讨论】:

  • 很抱歉,我尝试使用 about 一个已经无法正常工作了。
  • 它对我有用。所以我想也许它也对你有用。对不起
  • 实际上没有发生模型重用。我需要复用 Json1 和 Json2 的通用模型
  • 我只是想向您展示一种使用更少代码的响应处理方法,上述方法对我有用。顺便说一句,祝你的项目好运。 :)
【解决方案4】:

得到了答案!!!!

public class CommonModel<T>
{
    @SerializedName("code")
    @Expose
    private int code;

    @SerializedName("message")
    @Expose
    private String message;

    @SerializedName("result")
    @Expose
    private T result;
}

public void JSON1 {
    @SerializedName("id")
    public int id;

    @SerializedName("name")
    public String name;
}

public void JSON2 {
    @SerializedName("first_name")
    public String firstName;

    @SerializedName("last_name")
    public String lastName;

    @SerializedName("middle_name")
    public String middleName;
}

////////////////////////////////// 解决方案 //////////////////////////////////

调用>getSetupJsonOne();

调用>getSetupJsonTwo();

【讨论】:

  • 谢谢大家 Micho、Raphael Teyssandier、Aman、Muhammad Haseeb Khan
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多