【发布时间】:2022-01-07 11:06:16
【问题描述】:
我正在尝试反序列化以下 json,并希望在结果中仅包含必要的字段。
是否可以使用 gson 或其他方式从 commonfeed 数组中仅提取 "DD" 字段?或许用其他机制替换@SerializedName("DD")?
String json = "{\"common_feed\": [{\"DA\": 1}, {\"DZ\": 1}, {\"DB\": 1}, {\"DD\": 1641585600}, {\"DM\": \"\"}, {\"POS\": false}, {\"DX\": \"OD,HH,SCR,LT,TA,TV\"}, {\"DT\": false}], \"final_stage\": \"\", \"participantsData\": {\"home\": [{\"id\": \"YeGlkuUb\", \"name\": \"Mlada Boleslav\"}], \"away\": [{\"id\": \"rgfiJkOs\", \"name\": \"Litvinov\"}], \"is_national\": false}}";
final Result result = new GsonBuilder()
.serializeNulls()
.create()
.fromJson(json, Result.class);
System.out.println(result);
class Result {
ParticipantsData participantsData;
@SerializedName("common_feed")
List<CommonFeed> commonFeed;
@Override
public String toString() {
return "Result{" +
"participantsData=" + participantsData +
", commonFeed=" + commonFeed +
'}';
}
}
class ParticipantsData {
List<Team> home;
List<Team> away;
@Override
public String toString() {
return "ParticipantsData{" +
"home=" + home +
", away=" + away +
'}';
}
}
class Team {
String name;
@Override
public String toString() {
return "Team{" +
"name='" + name + '\'' +
'}';
}
}
class CommonFeed {
@SerializedName("DD")
int date;
public CommonFeed(int date) {
this.date = date;
}
@Override
public String toString() {
return "CommonFeed{" +
"date=" + date +
'}';
}
}
输出:
Result{participantsData=ParticipantsData{home=[Team{name='Mlada Boleslav'}], away=[Team{name='Litvinov'}]}, commonFeed=[CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=1641585600}, CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=0}, CommonFeed{date=0}]}
想要的输出:
Result{participantsData=ParticipantsData{home=[Team{name='Mlada Boleslav'}], away=[Team{name='Litvinov'}]}, commonFeed=[CommonFeed{date=1641585600}]}
【问题讨论】:
-
据我了解,您可能会看到这样的内容:stackoverflow.com/a/27424214/10832295
-
不可能,因为 Gson 会反序列化它所能做的一切。首先反序列化列表,然后使用
DD映射不为空的谓词对其进行过滤。如果它占用太多内存,请实现您自己的流阅读器,只提取您需要的内容。无论如何,它看起来像是一个糟糕的设计。 -
感谢您的两个建议。 @fluffy - 但是,我已经实现了你的。