通过gson使用混合子对象解析json并将其作为列表发回

时间:2014-05-02 23:40:13

标签: java json oop design-patterns gson

我遇到了解析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",
    }
  ]
}

我从中创建了一个Parent类和两个子类:

  

Num :类型,ID,计数,标题,说明字段

     

一个扩展Num :oneMemberOne,oneMemberTwo

     

两个扩展Num :twoMemberOne,twoMemberTwo

现在我的问题: 我有一种询问结果的方法。说出来List<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的用户必须根据父类的类型字段进行每次转发。因为webservice给了我混合的子类数组,所以我必须这样做。有没有更好的方法解决这个问题?

  • 另一种方法是创建一个Result类,其中包含两个成员OneTwo,并提供一个List<Result>而不是List<Num> , 但是然后用户必须检查成员是否为null,然后采取适当的步骤。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

我会建议你有另一个类这样的课。它可以防止客户端代码再次通过列表并解析出记录。请注意我没有运行此代码来测试它。

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()

Result getResults()

如果修改解析逻辑,用户也不必检查空值。请注意,如果我们没有结果,我们不会返回空列表,而是返回空列表。

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;

希望有所帮助:)