Java 通过gson解析带有混合子对象的json并以列表的形式发回

Java 通过gson解析带有混合子对象的json并以列表的形式发回,java,json,oop,design-patterns,gson,Java,Json,Oop,Design Patterns,Gson,我面临一个与解析json相关的问题,json包含混合的子类数组,我需要将其作为java列表返回给客户端 示例JSON: { "status": "OK", "results": [ { "type": "one", "Id": "2170676", "count": "456", "title": "title", "description": "description", "oneMemberOn

我面临一个与解析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",
    }
  ]
}
我创建了一个父类和两个子类:

{
  "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:类型、Id、计数、标题、描述字段

One扩展Num:oneMemberOne,oneMemberTwo

两个扩展Num:两个成员一个,两个成员二个

现在我的问题是: 我有一种询问结果的方法。说出它
List 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 result=new ArrayList();
    JsonParser=新的JsonParser();
    JsonObject JsonObject=parser.parse(lastResponsePayload.getAsJsonObject())
    JsonArray results=jsonObject.get(“results”).getAsJsonArray();
    for(JsonElement元素:结果){
    JsonObject trs=element.getAsJsonObject();
    字符串类型=trs.get(“type”).getAsString();
    if(类型等于(“一”){
    One=new Gson().fromJson(元素,One.class);
    结果:添加(产品);
    }else if(类型等于(“二”){
    Two-Two=new Gson().fromJson(元素,Two.class);
    结果:添加(元产品);
    }
    返回结果;
    
  • 现在,在客户端,在获得列表后,我必须执行以下操作:

    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);
    
    List results=getResults();
    List oness=new ArrayList();
    List twoss=new ArrayList();
    for(Num n:结果){
    如果(n.类型等于(“一”)
    添加((一)n);
    其他的
    二加((二)n);
    
对于这种情况,这种设计好吗?

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

  • 我脑海中的另一种方法是创建一个
    Result
    类,该类包含两个成员
    One
    two
    ,并提供一个
    列表,而不是
    List
    , 但用户必须检查成员是否为
    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;
    }
}

希望有帮助:)

谢谢。我已经考虑过这个解决方案了。我只是不想在问题中添加其他代码。它是完全有效的,是这个问题的另一个解决方案。我们决定修复web服务,因为它不应该在一个bucket中提供混合类的结果。然后使用类似的类就完全可以了,gson将解析它它自动且简单。我将结束这个问题,因为答案不止一个。如果你同意这是一个可能的答案,你会接受它作为答案吗?@Jabbar_Jigariyo:你应该像第一次一样返回一个
列表
,而不是返回一个分离对象的专用类的实例。因为有些客户可能会感兴趣通过整个列表,而不是一个一分为二的列表,特别是在项目顺序很重要的情况下:它们会丢失一个信息,并有更多的处理要做。相反,为类提供一个静态方法,该方法将拆分
列表
,并返回与此处描述的
结果
类等效的结果。这样,客户端就可以我有选择权。