Java 通过gson解析带有混合子对象的json并以列表的形式发回
我面临一个与解析json相关的问题,json包含混合的子类数组,我需要将其作为java列表返回给客户端 示例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
{
"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);
- 我脑海中的另一种方法是创建一个
类,该类包含两个成员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:你应该像第一次一样返回一个
列表
,而不是返回一个分离对象的专用类的实例。因为有些客户可能会感兴趣通过整个列表,而不是一个一分为二的列表,特别是在项目顺序很重要的情况下:它们会丢失一个信息,并有更多的处理要做。相反,为类提供一个静态方法,该方法将拆分列表
,并返回与此处描述的结果
类等效的结果。这样,客户端就可以我有选择权。