我遇到了解析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
类,其中包含两个成员One
和Two
,并提供一个List<Result>
而不是List<Num>
,
但是然后用户必须检查成员是否为null
,然后采取适当的步骤。提前谢谢。
答案 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;
希望有所帮助:)