【发布时间】:2018-07-17 11:42:09
【问题描述】:
我的目标是解析以下结构的 JSON 响应
{
"request":{"timestamp":1531826474,"version":1.1},
"Server1":["player1", "player2", "player3"],
"Server2:"["player1", "player2", "player3"],
[...]
}
通过镜像类结构并使用自定义反序列化器来遍历键并删除请求部分,因为在这种情况下我不需要它。服务器和玩家名称未知,数量各不相同。
public class WynnWorld {
private List<String> players;
public WynnWorld(List<String> players) {
this.players = players;
}
public List<String> getPlayers() {
return players;
}
public void setPlayers(List<String> players) {
this.players = players;
}
}
以前列表包含在一个单独的类中,但希望使用 Gson 的数组映射已放弃。
反序列化器:
public class JSONDeserializer implements JsonDeserializer<List<WynnWorld>> {
@Override
public List<WynnWorld> deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = element.getAsJsonObject();
jsonObject.remove("request");
System.out.println(jsonObject);
List<WynnWorld> list = new ArrayList<>();
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
System.out.println("Parsing: "+entry.getValue());
list.add(context.deserialize(entry.getValue(), WynnWorld.class));
}
return list;
}
}
过去几个小时我一直在切换类型、添加/删除类但无济于事,当前版本运行
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 尽管提供了一个列表。很明显,我的尝试都缺乏某种理解,因此将不胜感激。
解析尝试:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(WynnWorld.class, new JSONDeserializer());
Gson gson = builder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
List<WynnWorld> response = gson.fromJson(returnString.toString(), new TypeToken<List<WynnWorld>>(){}.getType());
【问题讨论】: