java-通过gson解析带有混合子对象的json并作为列表发送回

我遇到一个与解析json有关的问题,该json具有混合的子类数组,我需要将其作为java列表提供给客户端.

样本JSON

{
  "status": "OK",
  "results": [
    {
      "type": "one",
       "Id": "2170676",
       "count": "456",
       "title": "title",
       "description": "description",
       "oneMemberOne": "11",
       "oneMemberTwo": "12",
    }
    {
      "type": "two",
      "Id": "2170677",
      "count": "123",
      "title": "title",
      "description": "description",
      "twoMemberOne": "21",
      "twoMemberTwo": "22",
    }
  ]
}

我由此创建了一个父类和两个子类:

Num : type, Id, count, title, description fields

One extends Num : oneMemberOne, oneMemberTwo

Two extends Num : twoMemberOne, twoMemberTwo

现在我的问题是:
我有一种询问结果的方法.说出清单< Num>. getResults()

>我像这样正确解析数据:

List<Num> result = new ArrayList<Num>();
JsonParser parser = new JsonParser();
JsonObject jsonObject = parser.parse(lastResponsePayload).getAsJsonObject()
JsonArray results = jsonObject.get("results").getAsJsonArray();
for (JsonElement element : results) {
     JsonObject trs = element.getAsJsonObject();
     String type = trs.get("type").getAsString();

     if (type.equals("one") {
          One one = new Gson().fromJson(element, One.class);
          result.add(product);
     } else if (type.equals("two") {
          Two two = new Gson().fromJson(element, Two.class);
          result.add(metaproduct);
     }
return result;

>现在,在客户端上,在获得列表之后,我必须这样做:

List<Num> results = getResults();
List<One> oness = new ArrayList<One>();
List<Two> twoss = new ArrayList<Two>();
for(Num n : results) {
     if(n.type.equals("one")
          oness.add((One) n);
     else
          twoss.add((Two) n);

这是针对这种情况的良好设计吗?

此API的用户每次都必须根据父类的type字段进行向下转换.因为webservice给了我混合的子类数组,所以我必须这样做.有没有更好的方法来解决这个问题?

>我想到的另一种方法是创建一个包含两个成员“一”和“二”的Result类,并为我提供List< Result>.而不是List< Num&gt ;,
但是用户必须检查member是否为null,然后采取适当的步骤.

先感谢您.

解决方法:

我建议您再上一堂这样的课.它可以防止客户端代码再次遍历列表和解析记录.请注意,我尚未运行此代码对其进行测试.

public class Result {
    private List<One> oness;
    private List<Two> twoss;

    public List<One> getOness() {
        return oness;
    }

    public void setOness(List<One> oness) {
        this.oness = oness;
    }

    public List<Two> getTwoss() {
        return twoss;
    }

    public void setTwoss(List<Two> twoss) {
        this.twoss = twoss;
    }
}

并改变

List< Num> getResults()

结果getResults()

如果您修改解析逻辑,用户也不必检查是否为空.请注意,如果没有结果,我们将不返回空列表,而是返回EmptyList.

Result result = new Result();
    JsonParser parser = new JsonParser();
    JsonObject jsonObject = parser.parse(lastResponsePayload).getAsJsonObject()
    JsonArray results = jsonObject.get("results").getAsJsonArray();

    List<One> oness = null;
    List<Two> twoss = null;

    for (JsonElement element : results) {
         JsonObject trs = element.getAsJsonObject();
         String type = trs.get("type").getAsString();

         if (type.equals("one")) {
             if(oness == null) {
                 oness = new ArrayList<One>();
                 result.setOness(oness);
             }
             One one = new Gson().fromJson(element, One.class);
             oness.add(product);
         } else if (type.equals("two")) {
             if(twoss == null) {
                 twoss = new ArrayList<Two>();
                 result.setTwoss(twoss);
             }
              Two two = new Gson().fromJson(element, Two.class);
              twoss.add(metaproduct);
         }
         if(oness == null) {
             result.setOness(Collections.<One>EMPTY_LIST);
         }
         if(twoss == null) {
             result.setTwoss(Collections.<Two>EMPTY_LIST);
         }

    return result;

希望能帮助到你 :)

上一篇:android-尝试使用Retrofit在没有正文的情况下进行POST失败,并出现GSON解析异常


下一篇:春天-@ResponseStatus和@ResponseBody无法与@ExceptionHandler一起使用